Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

.bashrc 커스터마이징 완벽 가이드 – 별칭, 함수, 프롬프트 설정까지

.bashrc 파일을 잘 활용하면 리눅스 작업 흐름을 크게 개선하고 생산성을 높일 수 있습니다.

.bashrc는 리눅스 홈 디렉터리에 기본으로 존재하는 설정 파일입니다. 이 글에서는 실무에서 유용하게 쓸 수 있는 .bashrc 옵션, 별칭(alias), 함수(function) 등 다양한 설정 방법을 소개합니다.

.bashrc를 설정하면 얻을 수 있는 주요 장점은 다음과 같습니다.

  • 별칭(alias)을 추가하면 명령어 입력 속도가 빨라져 시간을 절약할 수 있습니다.
  • 함수를 등록해두면 복잡한 코드를 저장하고 반복 실행할 수 있습니다.
  • 터미널을 열 때 유용한 시스템 정보를 바로 확인할 수 있습니다.
  • Bash 프롬프트를 원하는 대로 꾸밀 수 있습니다.

.bashrc 편집 시작하기

텍스트 에디터를 사용해 .bashrc 파일을 열어 편집할 수 있습니다.

$ vim ~/.bashrc

Bash 히스토리 설정

히스토리에 날짜와 시간 정보를 함께 표시할 수 있습니다.

HISTTIMEFORMAT="%F %T "
# 출력 결과

$ history
 1017  20210228 10:51:28  uptime
 1019  20210228 10:52:42  free -m
 1020  20210228 10:52:49  tree --dirsfirst -F
 1018  20210228 10:51:38  xrandr | awk '/\*/{print $1}'

아래 한 줄을 추가하면 히스토리에 중복 명령어가 저장되지 않습니다.

HISTCONTROL=ignoredups

현재 세션의 히스토리 라인 수와 저장되는 Bash 히스토리 파일의 크기를 지정하려면 다음 두 줄을 추가합니다.

HISTSIZE=2000
HISTFILESIZE=2000

새 세션이 시작될 때 기존 히스토리를 덮어쓰지 않고 덧붙이도록(append) 설정할 수도 있습니다. shopt는 "shell options"의 약자로, 셸 동작 옵션을 제어하는 명령입니다.

shopt -s histappend

기본 셸 옵션 전체 목록은 shopt -p로 확인할 수 있습니다.

# 출력 결과

$ shopt -p

shopt -u autocd                   
shopt -u assoc_expand_once        
shopt -u cdable_vars              
shopt -u cdspell                  
shopt -u checkhash                
shopt -u checkjobs                
shopt -s checkwinsize             
[...]

프롬프트 색상 변수 만들기

변수를 미리 정의해 두면 Bash 프롬프트에 손쉽게 색상을 적용할 수 있습니다.

blk='\[\033[01;30m\]'   # 검정
red='\[\033[01;31m\]'   # 빨강
grn='\[\033[01;32m\]'   # 초록
ylw='\[\033[01;33m\]'   # 노랑
blu='\[\033[01;34m\]'   # 파랑
pur='\[\033[01;35m\]'   # 보라
cyn='\[\033[01;36m\]'   # 청록
wht='\[\033[01;37m\]'   # 흰색
clr='\[\033[00m\]'      # 초기화

Vim 모드 활성화

Vim 애호가라면 이 설정이 필수입니다. 명령줄에서 Vim 키 조합을 그대로 사용할 수 있게 해주며, 저 역시 .bashrc에 가장 먼저 추가하는 설정입니다.

set -o vi

.bashrc에서 별칭(Alias) 만들기

자주 사용하는 명령어에는 별칭을 지정하면 좋습니다. 별칭을 활용하면 입력 속도가 빨라져 시간을 아끼고 생산성을 높일 수 있습니다.

별칭 생성 문법은 alias <별칭>='긴 명령어' 형태입니다. 어떤 명령어가 별칭으로 만들 가치가 있는지 파악하려면, 아래 명령으로 가장 많이 실행한 상위 10개 명령어를 확인해 보세요.

$ history | awk '{cmd[$2]++} END {for(elem in cmd) {print cmd[elem] " " elem}}' | sort -n -r | head -10
# 출력 결과

171 git
108 cd
62 vim
51 python3
38 history
32 exit
30 clear
28 tmux
28 tree
27 ls

Git을 자주 사용한다면 Git 관련 명령어에 별칭을 만들어 두는 것이 매우 효율적입니다.

# Git 상태 확인.
alias gs='git status'

# 파일을 Git에 추가.
alias ga='git add'

# 모든 파일을 Git에 추가.
alias gaa='git add --all'

# 변경 사항 커밋.
alias gc='git commit'

# Git 로그 확인.
alias gl='git log --oneline'

# 새 브랜치를 생성하고 동시에 이동.
alias gb='git checkout -b'

# 차이점 비교.
alias gd='git diff'

그 외 유용한 별칭들

# 상위 폴더로 이동.
alias ..='cd ..;pwd'

# 두 단계 위 폴더로 이동.
alias ...='cd ../..;pwd'

# 세 단계 위 폴더로 이동.
alias ....='cd ../../..;pwd'
# c 입력으로 터미널 화면 지우기.
alias c='clear'

# h 입력으로 Bash 히스토리 보기.
alias h='history'

# 디렉터리 구조를 더 보기 좋게 출력.
alias tree='tree --dirsfirst -F'

# 부모 디렉터리까지 한 번에 생성하고 과정 표시.
alias mkdir='mkdir -p -v'

월 이름 앞 세 글자만 입력하면 해당 달의 달력을 볼 수 있는 별칭도 만들 수 있습니다.

alias jan='cal -m 01'
alias feb='cal -m 02'
alias mar='cal -m 03'
alias apr='cal -m 04'
alias may='cal -m 05'
alias jun='cal -m 06'
alias jul='cal -m 07'
alias aug='cal -m 08'
alias sep='cal -m 09'
alias oct='cal -m 10'
alias nov='cal -m 11'
alias dec='cal -m 12'
# 출력 결과

$ mar

     March 2021      
Su Mo Tu We Th Fr Sa 
    1  2  3  4  5  6 
 7  8  9 10 11 12 13 
14 15 16 17 18 19 20 
21 22 23 24 25 26 27 
28 29 30 31          

.bashrc에서 함수(Function) 활용하기

별칭 하나로 처리하기 어려운 복잡한 로직은 함수가 제격입니다.

함수의 기본 문법은 다음과 같습니다.

function funct_name() {
	# 코드;
}

디렉터리에서 가장 큰 파일 찾기

function find_largest_files() {
    du -h -x -s -- * | sort -r -h | head -20;
}
# 출력 결과

Downloads $ find_largest_files

709M	systemrescue-8.00-amd64.iso
337M	debian-10.8.0-amd64-netinst.iso
9.1M	weather-icons-master.zip
6.3M	Hack-font.zip
3.9M	city.list.json.gz
2.8M	dvdrental.tar
708K	IMG_2600.JPG
100K	sql_cheat_sheet_pgsql.pdf
4.0K	repeating-a-string.txt
4.0K	heart.svg
4.0K	Fedora-Workstation-33-1.2-x86_64-CHECKSUM
[...]

Git 브랜치를 표시하는 프롬프트 만들기

프롬프트에 색상을 입히고 현재 Git 브랜치까지 함께 표시할 수도 있습니다.

# Bash 프롬프트에 현재 Git 브랜치 표시.

function git_branch() {
    if [ -d .git ] ; then
        printf "%s" "($(git branch 2> /dev/null | awk '/\*/{print $2}'))";
    fi
}

# 프롬프트 설정.

function bash_prompt(){
    PS1='${debian_chroot:+($debian_chroot)}'${blu}'$(git_branch)'${pur}' \W'${grn}' \$ '${clr}
}

bash_prompt
.bashrc 커스터마이징 완벽 가이드 – 별칭, 함수, 프롬프트 설정까지

히스토리에서 명령어 검색하기

과거에 실행했던 명령어를 히스토리에서 grep으로 검색하는 함수입니다.

function hg() {
    history | grep "$1";
}
# 출력 결과

$ hg vim

305  2021-03-02 16:47:33 vim .bashrc
307  2021-03-02 17:17:09 vim .tmux.conf

Git으로 새 프로젝트 시작하기

디렉터리 생성부터 Git 초기화, 기본 파일 생성까지 한 번에 처리하는 함수입니다.

function git_init() {
    if [ -z "$1" ]; then
        printf "%s\n" "Please provide a directory name.";
    else
        mkdir "$1";
        builtin cd "$1";
        pwd;
        git init;
        touch readme.md .gitignore LICENSE;
        echo "# $(basename $PWD)" >> readme.md
    fi
}
# 출력 결과

$ git_init my_project

/home/brandon/my_project
Initialized empty Git repository in /home/brandon/my_project/.git/

명령줄에서 날씨 확인하기

터미널에서 날씨 정보를 받아올 수도 있습니다. 이 기능을 사용하려면 curl, jq 패키지와 Openweathermap에서 발급받은 API 키가 필요합니다. 자신의 위치 날씨를 가져오려면 Openweathermap API 문서를 참고해 URL을 올바르게 구성하세요.

curl과 jq는 다음 명령으로 설치합니다.

$ sudo apt install curl jq

# 또는

$ sudo dnf install curl jq
function weather_report() {

    local response=$(curl --silent 'https://api.openweathermap.org/data/2.5/weather?id=5128581&units=imperial&appid=<YOUR_API_KEY>') 

    local status=$(echo $response | jq -r '.cod')

	# API 요청 성공을 의미하는 200 응답인지 확인.
    case $status in
		
        200) printf "Location: %s %s\n" "$(echo $response | jq '.name') $(echo $response | jq '.sys.country')"  
             printf "Forecast: %s\n" "$(echo $response | jq '.weather[].description')" 
             printf "Temperature: %.1f°F\n" "$(echo $response | jq '.main.temp')" 
             printf "Temp Min: %.1f°F\n" "$(echo $response | jq '.main.temp_min')" 
             printf "Temp Max: %.1f°F\n" "$(echo $response | jq '.main.temp_max')" 
            ;;
        401) echo "401 error"
            ;;
        *) echo "error"
            ;;

    esac

}
# 출력 결과

$ weather_report

Location: "New York" "US"
Forecast: "clear sky"
Temperature: 58.0°F
Temp Min: 56.0°F
Temp Max: 60.8°F

.bashrc로 시스템 정보 출력하기

터미널을 열 때마다 유용한 시스템 정보를 자동으로 표시할 수도 있습니다.

clear

printf "\n"
printf "   %s\n" "IP ADDR: $(curl ifconfig.me)"
printf "   %s\n" "USER: $(echo $USER)"
printf "   %s\n" "DATE: $(date)"
printf "   %s\n" "UPTIME: $(uptime -p)"
printf "   %s\n" "HOSTNAME: $(hostname -f)"
printf "   %s\n" "CPU: $(awk -F: '/model name/{print $2}' | head -1)"
printf "   %s\n" "KERNEL: $(uname -rms)"
printf "   %s\n" "PACKAGES: $(dpkg --get-selections | wc -l)"
printf "   %s\n" "RESOLUTION: $(xrandr | awk '/\*/{printf $1" "}')"
printf "   %s\n" "MEMORY: $(free -m -h | awk '/Mem/{print $3"/"$2}')"
printf "\n"

실행 결과는 다음과 같습니다.

.bashrc 커스터마이징 완벽 가이드 – 별칭, 함수, 프롬프트 설정까지

설정을 마쳤다면 .bashrc 파일을 다시 불러와(source) 변경 사항을 즉시 적용하세요.

$ source ~/.bashrc

전체 설정 모음

지금까지 소개한 커스터마이징 설정을 모두 합치면 다음과 같습니다. 새 시스템을 구축할 때 저는 이 내용 전체를 .bashrc 파일의 기본 코드 아래에 붙여 넣습니다.

######################################################################
#
#
#           ██████╗  █████╗ ███████╗██╗  ██╗██████╗  ██████╗
#           ██╔══██╗██╔══██╗██╔════╝██║  ██║██╔══██╗██╔════╝
#           ██████╔╝███████║███████╗███████║██████╔╝██║     
#           ██╔══██╗██╔══██║╚════██║██╔══██║██╔══██╗██║     
#           ██████╔╝██║  ██║███████║██║  ██║██║  ██║╚██████╗
#           ╚═════╝ ╚═╝  ╚═╝╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝ ╚═════╝
#
#
######################################################################

set -o vi

HISTTIMEFORMAT="%F %T "

HISTCONTROL=ignoredups

HISTSIZE=2000

HISTFILESIZE=2000

shopt -s histappend

blk='\[\033[01;30m\]'   # Black
red='\[\033[01;31m\]'   # Red
grn='\[\033[01;32m\]'   # Green
ylw='\[\033[01;33m\]'   # Yellow
blu='\[\033[01;34m\]'   # Blue
pur='\[\033[01;35m\]'   # Purple
cyn='\[\033[01;36m\]'   # Cyan
wht='\[\033[01;37m\]'   # White
clr='\[\033[00m\]'      # Reset

alias gs='git status'

alias ga='git add'

alias gaa='git add --all'

alias gc='git commit'

alias gl='git log --oneline'

alias gb='git checkout -b'

alias gd='git diff'

alias ..='cd ..;pwd'

alias ...='cd ../..;pwd'

alias ....='cd ../../..;pwd'

alias c='clear'

alias h='history'

alias tree='tree --dirsfirst -F'

alias mkdir='mkdir -p -v'

alias jan='cal -m 01'
alias feb='cal -m 02'
alias mar='cal -m 03'
alias apr='cal -m 04'
alias may='cal -m 05'
alias jun='cal -m 06'
alias jul='cal -m 07'
alias aug='cal -m 08'
alias sep='cal -m 09'
alias oct='cal -m 10'
alias nov='cal -m 11'
alias dec='cal -m 12'

function hg() {
    history | grep "$1";
}

function find_largest_files() {
    du -h -x -s -- * | sort -r -h | head -20;
}

function git_branch() {
    if [ -d .git ] ; then
        printf "%s" "($(git branch 2> /dev/null | awk '/\*/{print $2}'))";
    fi
}

# 프롬프트 설정.
function bash_prompt(){
    PS1='${debian_chroot:+($debian_chroot)}'${blu}'$(git_branch)'${pur}' \W'${grn}' \$ '${clr}
}

bash_prompt

function git_init() {
    if [ -z "$1" ]; then
        printf "%s\n" "Please provide a directory name.";
    else
        mkdir "$1";
        builtin cd "$1";
        pwd;
        git init;
        touch readme.md .gitignore LICENSE;
        echo "# $(basename $PWD)" >> readme.md
    fi
}

function weather_report() {

    local response=$(curl --silent 'https://api.openweathermap.org/data/2.5/weather?id=5128581&units=imperial&appid=<YOUR_API_KEY>') 

    local status=$(echo $response | jq -r '.cod')

    case $status in
		
        200) printf "Location: %s %s\n" "$(echo $response | jq '.name') $(echo $response | jq '.sys.country')"  
             printf "Forecast: %s\n" "$(echo $response | jq '.weather[].description')" 
             printf "Temperature: %.1f°F\n" "$(echo $response | jq '.main.temp')" 
             printf "Temp Min: %.1f°F\n" "$(echo $response | jq '.main.temp_min')" 
             printf "Temp Max: %.1f°F\n" "$(echo $response | jq '.main.temp_max')" 
            ;;
        401) echo "401 error"
            ;;
        *) echo "error"
            ;;

    esac

}

clear

printf "\n"
printf "   %s\n" "IP ADDR: $(curl ifconfig.me)"
printf "   %s\n" "USER: $(echo $USER)"
printf "   %s\n" "DATE: $(date)"
printf "   %s\n" "UPTIME: $(uptime -p)"
printf "   %s\n" "HOSTNAME: $(hostname -f)"
printf "   %s\n" "CPU: $(awk -F: '/model name/{print $2}' | head -1)"
printf "   %s\n" "KERNEL: $(uname -rms)"
printf "   %s\n" "PACKAGES: $(dpkg --get-selections | wc -l)"
printf "   %s\n" "RESOLUTION: $(xrandr | awk '/\*/{printf $1" "}')"
printf "   %s\n" "MEMORY: $(free -m -h | awk '/Mem/{print $3"/"$2}')"
printf "\n"

마치며

이 글에서는 .bashrc의 다양한 옵션, 별칭, 함수 설정 방법을 살펴보며 작업 흐름을 개선하고 생산성을 높이는 방법을 알아보았습니다. 소개된 설정들을 자신의 환경에 맞게 응용해 보세요.