최근 Bash 스크립트로 Ubuntu를 설정하는 글에서 .bashrc의 마법에 대해 잠깐 언급한 적이 있습니다. 하지만 그 정도로는 부족했기에, 이번에는 Bash 설정 파일이 무엇을 할 수 있는지 좀 더 자세히 다뤄보려 합니다.
제가 현재 사용 중인 설정은 워크플로우를 크게 개선해 주고, 설정 없이 입력해야 할 키 입력을 무려 50% 이상 줄여줍니다! 지금부터 별칭(alias), 함수(function), 프롬프트(prompt) 설정 예시를 통해 어떻게 더 적은 키 입력으로 효율성을 높일 수 있는지 살펴보겠습니다.
Bash 별칭(Alias)
잘 작성된 .bashrc는 상당히 많은 키 입력을 절약해 줍니다. 문자열이 더 긴 명령어로 확장되는 Bash 별칭을 활용하면 말 그대로 타이핑을 줄일 수 있습니다. 대표적인 예시로, 터미널에서 파일을 복사할 때 사용하는 Bash 별칭은 다음과 같습니다:
# 디렉터리 내용은 항상 재귀적으로(r) 복사하고, 수행한 작업을 설명(v)함
alias cp='cp -rv'alias 명령은 우리가 입력할 문자열을 정의하고, 그 뒤에 해당 문자열이 확장될 명령을 지정합니다. 위의 cp처럼 기존 명령어를 덮어쓸 수도 있습니다. 원래 cp 명령만으로는 파일만 복사되고 디렉터리는 복사되지 않으며, 성공해도 아무런 메시지도 출력하지 않습니다. 이 별칭을 사용하면 두 플래그를 일일이 기억할 필요도 없고, 복사된 파일을 확인하려고 cd나 ls로 해당 위치를 찾아갈 필요도 없습니다! 이제 단 두 글자만으로 모든 작업이 처리됩니다.
자주 쓰는 명령어에 플래그를 붙이는 데 유용한 .bashrc 별칭 몇 가지를 더 소개합니다.
# 파일 형식별 색상으로 목록을 표시하고, 거의 모든 숨김 파일(. 과 .. 제외)을 (A)표시하며,
# 열(C) 단위로 정렬하고 파일 종류 표시(F)자를 붙임
alias ls='ls --color=auto -ACF'
# 파일 형식별 색상으로 목록을 표시하고, 모든 숨김 항목(. 과 .. 포함)을 (a)표시하며,
# 자세한(l) 목록 형식과 파일 종류 표시(F)자를 사용
alias ll='ls --color=auto -alF'
# 파일을 옮길 때 수행한 작업을 설명(v)함
alias mv='mv -v'
# 존재하지 않는 상위(p) 디렉터리까지 생성하고, 수행한 작업을 설명(v)함
alias mkdir='mkdir -pv'
# 부분적으로 다운로드된 파일은 항상 이어받기(c) 시도
alias wget='wget -c'긴 명령어 입력을 피하고 싶을 때도 별칭이 유용합니다. Python 환경 작업 시 제가 사용하는 별칭들입니다:
alias pym='python3 manage.py'
alias mkenv='python3 -m venv env'
alias startenv='source env/bin/activate && which python3'
alias stopenv='deactivate'Bash 별칭으로 시간을 절약하는 방법에 대한 영감이 더 필요하다면, 관련 아티클에 정리된 예시들을 강력히 추천합니다.
Bash 함수(Function)
위 별칭들의 단점은 꽤 정적이라는 것입니다. 항상 선언된 텍스트 그대로 확장됩니다. 인수를 받는 Bash 별칭이 필요하다면 함수를 만들어야 합니다. 다음과 같이 만들 수 있습니다:
# 디렉터리로 이동한 후 내용 표시
function cd () {
builtin cd "$1"
ls -ACF
}cd를 입력한 직후 곧바로 ls를 입력해서 현재 디렉터리 내용을 확인했던 횟수는 헤아릴 수도 없습니다. 이 함수 하나면 단 두 글자만으로 모든 것이 해결됩니다! 함수는 첫 번째 인수인 $1을 이동할 위치로 받아, 해당 디렉터리의 내용을 파일 형식 표시자와 함께 보기 좋은 열 형태로 출력합니다. builtin 부분은 Bash가 기본 명령어를 덮어쓰도록 허용하게 만드는 데 필요합니다.
Bash 함수는 소프트웨어를 다운로드하거나 업그레이드할 때도 매우 유용합니다. 저는 뛰어난 배포 빈도 덕분에 몇 주마다 적어도 몇 분씩 정적 사이트 생성기 Hugo의 새 확장 버전을 다운로드하곤 했습니다. 함수를 사용하면 버전만 전달하면 되고, 업그레이드는 몇 초 안에 끝납니다.
# Hugo 설치 또는 업그레이드
function gethugo () {
wget -q -P tmp/ https://github.com/gohugoio/hugo/releases/download/v"$@"/hugo_extended_"$@"_Linux-64bit.tar.gz
tar xf tmp/hugo_extended_"$@"_Linux-64bit.tar.gz -C tmp/
sudo mv -f tmp/hugo /usr/local/bin/
rm -rf tmp/
hugo version
}$@ 표기법은 전달된 모든 인수를 받아 함수 내 해당 위치에 치환합니다. 위 함수를 실행해 Hugo 0.57.2 버전을 다운로드하려면 gethugo 0.57.2 명령을 사용하면 됩니다.
Golang용으로도 하나 만들어 두었습니다:
function getgolang () {
sudo rm -rf /usr/local/go
wget -q -P tmp/ https://dl.google.com/go/go"$@".linux-amd64.tar.gz
sudo tar -C /usr/local -xzf tmp/go"$@".linux-amd64.tar.gz
rm -rf tmp/
go version
}현재 저장소에 GitLab 원격 origin URL을 추가하는 함수는 어떠세요?
function glab () {
git remote set-url origin --add git@gitlab.com:"$@"/"${PWD##*/}".git
git remote -v
}glab username을 실행하면 GitLab.com의 username을 사용해 현재 Git 저장소의 새로운 origin URL을 생성할 수 있습니다. 새 원격 URL로 푸시하면 자동으로 비공개 GitLab 저장소가 생성되므로 백업을 만들 때 유용한 단축 방법입니다!
Bash 함수는 사실상 스크립팅의 가능성에 의해서만 제한되는데, 스크립팅에는 실질적으로 거의 한계가 없습니다. 터미널에 몇 줄 입력해야 하는 반복 작업이 있다면, 그것을 위한 Bash 함수를 만들 수 있을 가능성이 높습니다!
Bash 프롬프트(Prompt)
디렉터리 내용 외에도 현재 위치한 디렉터리의 전체 경로를 확인할 수 있으면 유용합니다. Bash 프롬프트는 이 경로와 함께 현재 Git 브랜치 같은 유용한 정보도 보여줄 수 있습니다. 가독성을 높이기 위해 프롬프트의 각 부분에 색상을 지정할 수 있습니다. .bashrc에서 이를 구현하는 방법은 다음과 같습니다:
# 색상 코드는 다루기 불편하니 이름을 붙이자
txtcyn='\[\e[0;96m\]' # 청록(Cyan)
txtpur='\[\e[0;35m\]' # 보라(Purple)
txtwht='\[\e[0;37m\]' # 흰색(White)
txtrst='\[\e[0m\]' # 텍스트 리셋
# 프롬프트의 어느 부분에 어떤 (C)색상을 사용할까?
pathC="${txtcyn}"
gitC="${txtpur}"
pointerC="${txtwht}"
normalC="${txtrst}"
# 브랜치 이름을 가져와 괄호로 감싸기
gitBranch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
# 프롬프트 구성
export PS1="${pathC}\w ${gitC}\$(gitBranch) ${pointerC}\$${normalC} "결과:
~/github/myrepo (master) $색상에 이름을 붙이면 한 색상이 시작하고 끝나는 지점, 다음 색상이 시작되는 지점을 쉽게 파악할 수 있습니다. 터미널에서 보이는 프롬프트는 export PS1 뒤에 오는 문자열로 정의되며, 프롬프트의 각 구성 요소는 이스케이프 시퀀스로 설정됩니다. 하나씩 분해해 보겠습니다:
\w: 현재 작업 디렉터리를 표시합니다.\$(gitBranch): 위에서 정의한gitBranch함수를 호출해 현재 Git 브랜치를 표시합니다.\$: 일반 사용자이거나 일반 사용자 모드일 때는 "$", root일 때는 "#"을 표시합니다.
Bash 이스케이프 시퀀스 전체 목록을 참고하면 시간과 날짜까지 포함해 훨씬 많은 정보를 표시할 수 있습니다! Bash 프롬프트는 고도로 커스터마이즈 가능한 개인적인 영역이므로, 원하는 어떤 방식으로든 자유롭게 설정하세요.
정보를 한눈에 보여줘서 효율적으로 작업하는 데 도움이 되는 몇 가지 옵션을 소개합니다.
미루기를 싫어하는 분들을 위해
사용자 이름과 초 단위까지 표시되는 24시간 HH:MM:SS 형식의 현재 시간:
export PS1="${userC}\u ${normalC}at \t >"user at 09:35:55 >
항상 현재 위치를 알고 싶은 분들을 위해
별도 줄에 전체 파일 경로와 사용자 이름 표시:
export PS1="${pathC}\w${normalC}\n\u:"~/github/myrepo
user:
미니멀리스트를 위해
export PS1=">">
기본 이스케이프 시퀀스만으로도 실용적인 프롬프트를 많이 만들 수 있고, Git 브랜치 예시처럼 함수를 프롬프트와 통합하기 시작하면 훨씬 복잡해질 수 있습니다. 이 정도의 복잡함이 생산성에 도움이 될지 해가 될지는 오직 여러분만이 판단할 수 있습니다!
간단히 검색만 하면 바로 활용할 수 있는 프로그램들로 화려한 Bash 프롬프트를 만드는 것도 가능합니다. 여기서 예시를 일부러 제공하지 않은 이유는, 저처럼 이런 것에 흥분할 수 있는 사람이라면 이 글을 읽기 시작하기 전에 하던 일로 돌아가기까지 몇 시간이 걸릴 수 있고, 그건 제 양심이 허락하지 않기 때문입니다. ?
이제 Bash 설정 파일에 투자한 시간과 얻은 유용성 사이의 좋은 균형을 찾았기를 바랍니다! 새롭게 회복된 키 입력 여유분을 선한 일에 사용하시길 바랍니다.