Bash 별칭(alias)은 기존 Bash 명령어를 새로운 명령어로 대체하거나 보완하는 방법입니다. 별칭을 활용하면 POSIX 터미널에서의 사용자 경험을 손쉽게 커스터마이징할 수 있습니다. 일반적으로 $HOME/.bashrc 또는 $HOME/.bash_aliases(반드시 .bashrc에서 불러와야 함) 파일에 정의합니다.
대부분의 리눅스 배포판은 새 사용자 계정의 기본 .bashrc 파일에 몇 가지 인기 있는 별칭을 미리 등록해 둡니다. 다음은 Bash 별칭 문법을 보여주는 간단한 예시입니다.
alias ls='ls -F'
alias ll='ls -lh'
하지만 모든 배포판이 별칭을 기본 제공하는 것은 아닙니다. 별칭을 직접 추가했다면 현재 Bash 세션에 불러와야 합니다.
$ source ~/.bashrc
또는 터미널을 닫았다가 다시 열어 설정 파일을 새로 불러올 수도 있습니다.
이렇게 Bash 초기화 스크립트에 별칭을 정의해 두면, ll만 입력해도 ls -lh의 결과를 얻고, ls를 입력하면 단순한 ls 출력 대신 개선된 결과를 확인할 수 있습니다.
이런 별칭들도 유용하지만, 별칭으로 할 수 있는 작업의 극히 일부일 뿐입니다. 아래에서 소개하는 10가지 Bash 별칭은 한번 사용해 보면 더 이상 없이는 살 수 없게 될 필수품입니다.
사전 준비 작업
시작하기 전에 먼저 ~/.bash_aliases라는 파일을 생성합니다.
$ touch ~/.bash_aliases
그다음 ~/.bashrc 파일에 다음 코드가 포함되어 있는지 확인합니다.
if [ -e $HOME/.bash_aliases ]; then
source $HOME/.bash_aliases
fi
이 글에서 소개하는 별칭을 직접 사용해 보려면 해당 별칭을 .bash_aliases 파일에 입력한 뒤, source ~/.bashrc 명령으로 현재 Bash 세션에 불러오면 됩니다.
파일 크기순 정렬
GNOME의 노틸러스(Files), macOS의 Finder, 윈도우의 탐색기 같은 GUI 파일 관리자와 함께 컴퓨터를 접하기 시작했다면, 파일 목록을 크기순으로 정렬하는 데 익숙할 것입니다. 터미널에서도 물론 가능하지만 명령어가 다소 길어집니다.
GNU 시스템이라면 다음 별칭을 설정에 추가하세요.
alias lt='ls --human-readable --size -1 -S --classify'
이 별칭은 lt를 각 항목의 크기를 표시하고, 크기순으로 한 열(column)로 정렬하며, 파일 종류를 나타내는 기호까지 붙여 주는 ls 명령으로 대체합니다. 새 별칭을 불러온 뒤 실행해 보겠습니다.
$ source ~/.bashrc
$ lt
total 344K
140K configure*
44K aclocal.m4
36K LICENSE
32K config.status*
24K Makefile
24K Makefile.in
12K config.log
8.0K README.md
4.0K info.slackermedia.Git-portal.json
4.0K git-portal.spec
4.0K flatpak.path.patch
4.0K Makefile.am*
4.0K dot-gitlab.ci.yml
4.0K configure.ac*
0 autom4te.cache/
0 share/
0 bin/
0 install-sh@
0 compile@
0 missing@
0 COPYING@
macOS나 BSD에서는 ls 명령이 동일한 옵션을 지원하지 않으므로, 대신 이 별칭을 사용합니다.
alias lt='du -sh * | sort -h'
이 버전의 결과물은 조금 다릅니다.
$ du -sh * | sort -h
0 compile
0 COPYING
0 install-sh
0 missing
4.0K configure.ac
4.0K dot-gitlab.ci.yml
4.0K flatpak.path.patch
4.0K git-portal.spec
4.0K info.slackermedia.Git-portal.json
4.0K Makefile.am
8.0K README.md
12K config.log
16K bin
24K Makefile
24K Makefile.in
32K config.status
36K LICENSE
44K aclocal.m4
60K share
140K configure
476K autom4te.cache
사실 리눅스에서도 이 명령은 유용합니다. ls는 디렉터리와 심볼릭 링크를 크기 0으로 표시하기 때문인데, 실제로 원하는 정보가 아닐 수 있기 때문입니다. 어떤 것을 사용할지는 여러분의 선택입니다.
Brad Alexander에게 이 별칭 아이디어를 제공해 준 것에 감사드립니다.
마운트된 드라이브만 깔끔하게 보기
mount 명령은 예전에는 무척 단순했습니다. 명령 하나로 컴퓨터에 마운트된 모든 파일 시스템 목록을 확인할 수 있었고, 워크스테이션에 연결된 드라이브를 개괄적으로 파악하는 데 자주 사용됐습니다. 대부분의 컴퓨터에는 USB 포트가 많아야 세어 개였기 때문에 항목이 네 개 이상 넘어가면 놀랍기까지 했고, 결과도 충분히 관리 가능한 수준이었습니다.
하지만 요즘 컴퓨터 환경은 좀 더 복잡해졌습니다. LVM, 물리 드라이브, 네트워크 스토리지, 가상 파일 시스템이 뒤섞이면서 mount의 출력을 해석하기가 어려워졌습니다.
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=8131024k,nr_inodes=2032756,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
[...]
/dev/nvme0n1p2 on /boot type ext4 (rw,relatime,seclabel)
/dev/nvme0n1p1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro)
[...]
gvfsd-fuse on /run/user/100977/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=100977,group_id=100977)
/dev/sda1 on /run/media/seth/pocket type ext4 (rw,nosuid,nodev,relatime,seclabel,uhelper=udisks2)
/dev/sdc1 on /run/media/seth/trip type ext4 (rw,nosuid,nodev,relatime,seclabel,uhelper=udisks2)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
이 문제를 해결하려면 다음과 같은 별칭을 시도해 보세요.
alias mnt="mount | awk -F' ' '{ printf \"%s\t%s\n\",\$1,\$3; }' | column -t | egrep ^/dev/ | sort"
이 별칭은 awk로 mount의 출력을 열 단위로 파싱하여, 실제로 찾고자 하는 정보(파일 시스템이 아닌 마운트된 하드 드라이브)만 남깁니다.
$ mnt
/dev/mapper/fedora-root /
/dev/nvme0n1p1 /boot/efi
/dev/nvme0n1p2 /boot
/dev/sda1 /run/media/seth/pocket
/dev/sdc1 /run/media/seth/trip
macOS에서는 mount 명령의 출력이 그리 장황하지 않아 별칭이 과할 수 있습니다. 그래도 간결한 보고서를 선호한다면 다음을 사용해 보세요.
alias mnt='mount | grep -E ^/dev | column -t'
결과는 다음과 같습니다.
$ mnt
/dev/disk1s1 on / (apfs, local, journaled)
/dev/disk1s4 on /private/var/vm (apfs, local, noexec, journaled, noatime, nobrowse)
Bash 히스토리에서 명령어 검색하기
누구나 터미널에서 어떤 작업을 처리하는 방법을 알아낸 뒤 '절대 잊지 않겠다'고 다짐한 적이 있을 겁니다. 그런데 한 시간만 지나면 그 과정을 완전히 잊어버리곤 하죠.
Bash 히스토리 검색은 누구나 가끔씩 해야 하는 작업입니다. 찾고자 하는 내용을 정확히 안다면 Ctrl+R로 역방향 검색을 할 수 있지만, 원하는 명령어를 정확히 기억하지 못할 때가 종종 있습니다.
그럴 때 이 별칭이 작업을 한결 수월하게 만들어 줍니다.
alias gh='history|grep'
사용 예시는 다음과 같습니다.
$ gh bash
482 cat ~/.bashrc | grep _alias
498 emacs ~/.bashrc
530 emacs ~/.bash_aliases
531 source ~/.bashrc
수정 시간순 정렬
매주 월요일마다 벌어지는 일입니다. 출근해서 자리에 앉고, 터미널을 열고, 지난주 금요일에 무슨 작업을 하다 말았는지 기억나지 않는 것이죠. 이럴 때 최근 수정된 파일 목록을 보여 주는 별칭이 필요합니다.
ls 명령으로 마지막 작업 지점을 찾도록 도와주는 별칭을 만들 수 있습니다.
alias left='ls -t -1'
출력은 단순하지만, 원한다면 --long 옵션을 추가해 확장할 수 있습니다. 위 상태 그대로의 별칭은 다음과 같이 표시됩니다.
$ left
demo.jpeg
demo.xcf
design-proposal.md
rejects.txt
brainstorm.txt
query-letter.xml
파일 개수 세기
디렉터리 안에 파일이 몇 개 있는지 알아야 한다면, 그 해답은 유닉스 명령 구성의 가장 고전적인 사례 중 하나입니다. ls로 파일 목록을 만들고, -1 옵션으로 출력을 한 열로 제한한 뒤, 그 출력을 wc(word count) 명령에 파이프하여 줄 수, 즉 파일 개수를 세는 방식입니다.
작은 시스템 구성 요소들을 조합해 사용자 스스로 해결책을 만들 수 있다는 유닉스 철학의 훌륭한 시연이죠. 하지만 이 조합은 하루에 여러 번 입력하기에는 타이핑량이 많고, -R 옵션 없이는 하위 디렉터리가 있는 경우 제대로 동작하지 않으며, -R을 붙이면 출력에 새 줄이 추가되어 오히려 의미가 없어집니다.
대신 다음 별칭이 이 과정을 간단하게 만들어 줍니다.
alias count='find . -type f | wc -l'
이 별칭은 디렉터리 자체는 무시하되, 디렉터리 내부의 내용은 포함하여 계산합니다. 프로젝트 폴더 안에 디렉터리 두 개가 있고 각각 파일 두 개씩 들어 있다면, 전체 프로젝트에 파일이 네 개이므로 별칭은 4를 반환합니다.
$ ls
foo bar
$ count
4
Python 가상 환경 생성하기
Python으로 코딩하시나요?
Python 코딩을 자주 하시나요?
그렇다면 Python 가상 환경을 생성하는 데 최소 53번의 키 입력이 필요하다는 것을 알고 있을 겁니다.
무려 49번이나 많은 셈인데, ve와 va라는 두 개의 별칭으로 손쉽게 해결할 수 있습니다.
alias ve='python3 -m venv ./venv'
alias va='source ./venv/bin/activate'
ve를 실행하면 Python3 가상 환경의 표준 파일 시스템을 담은 venv라는 새 디렉터리가 생성됩니다. va 별칭은 현재 셸에서 해당 환경을 활성화합니다.
$ cd my-project
$ ve
$ va
(venv) $
복사 진행률 표시줄 추가하기
진행률 표시줄은 부정확하기로 악명 높아 늘 놀림감이 되지만, 솔직히 말해 우리 모두는 그것을 원합니다. 유닉스의 cp 명령에는 진행률 표시줄이 없지만, 자세한 정보를 출력하는 -v 옵션이 있어 복사 중인 각 파일의 이름을 터미널에 표시해 줍니다. 꽤 괜찮은 편법이지만, 하나의 큰 파일을 복사하며 얼마나 전송됐는지 확인하고 싶을 때는 그다지 유용하지 않습니다.
pv 명령은 복사 중 진행률 표시줄을 제공하지만 기본 애플리케이션으로 흔히 설치돼 있지는 않습니다. 반면 rsync 명령은 거의 모든 POSIX 시스템의 기본 설치에 포함되어 있으며, 로컬 및 원격 파일 복사에 가장 똑똑한 방법 중 하나로 널리 인정받고 있습니다.
더 좋은 점은, rsync에는 진행률 표시줄이 내장되어 있다는 것입니다.
alias cpv='rsync -ah --info=progress2'
이 별칭의 사용법은 cp 명령과 동일합니다.
$ cpv bigfile.flac /run/media/seth/audio/
3.83M 6% 213.15MB/s 0:00:00 (xfr#4, to-chk=0/4)
이 명령의 흥미로운 부가 효과 하나는, rsync는 cp에서 필요한 -r 플래그 없이도 파일과 디렉터리를 모두 복사한다는 점입니다.
파일 삭제 실수로부터 자신을 보호하기
rm 명령은 사용하지 않는 것이 좋습니다. rm 매뉴얼조차 그렇게 말합니다.
경고: 'rm'을 사용해 파일을 삭제하면 일반적으로 해당 파일의 내용을 복구하는 것이 가능합니다. 내용이 진정으로 복구 불가능하다는 확신이 필요하다면 'shred' 사용을 고려하십시오.
파일을 삭제하고 싶다면, 데스크톱 환경에서 하듯 휴지통으로 파일을 옮겨야 합니다.
POSIX는 이를 쉽게 만들어 줍니다. 휴지통은 파일 시스템에서 접근 가능한 실제 위치이기 때문입니다. 위치는 플랫폼에 따라 다릅니다. FreeDesktop 환경에서는 ~/.local/share/Trash, macOS에서는 ~/.Trash에 위치하지만, 어느 쪽이든 영구 삭제할 준비가 될 때까지 파일을 숨겨 두는 디렉터리일 뿐입니다.
이 간단한 별칭은 터미널에서 휴지통으로 파일을 버릴 수 있는 방법을 제공합니다.
alias tcn='mv --force -t ~/.local/share/Trash '
이 별칭은 잘 알려지지 않은 mv 플래그를 사용하여, 평소와 달리 옮길 파일을 마지막 인수로 지정할 수 있게 해 줍니다. 이제 새 명령으로 파일과 폴더를 시스템 휴지통으로 옮길 수 있습니다.
$ ls
foo bar
$ tcn foo
$ ls
bar
이제 파일은 "사라졌습니다". 물론 식은땀을 흘리며 "아직 그 파일이 필요했는데!"라고 깨닫기 전까지의 이야기죠. 그 시점에 시스템 휴지통에서 파일을 구출하면 됩니다. 그때는 Bash와 mv 개발자들에게 감사 인사를 전하는 것도 잊지 마세요.
참고: FreeDesktop 표준을 더 잘 준수하는 강력한 Trash 명령이 필요하다면 Trashy를 참고하세요.
Git 워크플로 간소화하기
모든 사람은 저마다 고유한 워크플로를 가지고 있지만, 어떤 경우든 반복적인 작업이 존재하기 마련입니다. Git을 정기적으로 사용한다면 매우 자주 반복하게 되는 작업 시퀀스가 있을 겁니다. 하루 종일 master 브랜치로 돌아가 최신 변경 사항을 pull하는 일, 태그를 만들고 원격 저장소로 push하는 일, 혹은 완전히 다른 무언가일 수도 있습니다.
타이핑하기 지겨워진 Git 명령어가 무엇이든, Bash 별칭으로 그 고통을 덜 수 있습니다. 훅(hook)에 인수를 전달할 수 있는 능력 덕분에, Git은 Bash에서 기묘한 기술을 부리지 않아도 되도록 해주는 풍부한 자기 분석(introspective) 명령 세트를 갖추고 있습니다.
예를 들어, Bash에서 프로젝트의 최상위 디렉터리를 찾는 것은 꽤 번거롭습니다(Bash 입장에서는 절대적인 최상위가 루트 디렉터리이므로 프로젝트 최상위는 완전히 임의적인 개념입니다). 반면 Git은 간단한 질의만으로 자신의 최상위 위치를 압니다. Git 훅을 공부하면 Bash는 전혀 모르는 각종 정보를 얻을 수 있고, 그 정보를 Bash 별칭으로 활용할 수 있습니다.
다음 별칭은 현재 프로젝트 어느 위치에서 작업 중이든 Git 프로젝트의 최상위 디렉터리를 찾아 그곳으로 이동하고, master 브랜치로 전환한 뒤 git pull을 수행합니다.
alias startgit='cd `git rev-parse --show-toplevel` && git checkout master && git pull'
이런 종류의 별칭이 모두에게 유용한 것은 결코 아니지만, 비교적 단순한 별칭 하나로 번거로운 디렉터리 이동, 명령 입력, 프롬프트 대기를 얼마나 많이 줄일 수 있는지 보여 주는 사례입니다.
더 단순하고 아마도 더 보편적인 별칭은 Git 프로젝트의 최상위로 돌아가는 것입니다. 프로젝트 작업 중일 때는 그 프로젝트가 일종의 "임시 홈" 디렉터리 역할을 하기 때문에 유용합니다. 실제 홈 디렉터리로 가듯이 쉽게 "홈"으로 돌아갈 수 있어야 하는데, 다음 별칭이 바로 그 역할을 합니다.
alias cg='cd `git rev-parse --show-toplevel`'
이제 cg 명령 하나로 디렉터리 구조 아무리 깊은 곳에 있더라도 Git 프로젝트의 최상위로 이동할 수 있습니다.
디렉터리 이동과 내용 확인을 동시에 하기
어떤 유명 과학자가, cd를 입력하고 이어서 ls를 입력하는 개발자들이 소비하는 에너지를 활용하면 지구의 에너지 문제를 해결할 수 있다고 (전해지기로) 제안한 적이 있습니다.
이것이 흔한 패턴인 이유는 단순합니다. 디렉터리를 이동할 때면 대개 주변에 무엇이 있는지 확인하고 싶거나 확인해야 할 필요가 있기 때문입니다.
하지만 컴퓨터의 디렉터리 트리를 "탐험"하는 일이 굳이 멈췄다 출발하는 과정일 필요는 없습니다.
이번 항목은 약간 반칙입니다. 엄밀히 말하면 별칭이 아니기 때문입니다. 하지만 Bash 함수를 탐구할 좋은 기회입니다. 별칭은 빠른 치환에 탁월하지만, Bash는 .bashrc 파일(또는 별칭 파일을 불러오듯 .bashrc에서 로드하는 별도의 함수 파일)에 로컬 함수를 추가할 수 있게 해 줍니다.
모듈성을 유지하기 위해 ~/.bash_functions라는 새 파일을 만들고, .bashrc가 이를 불러오도록 합니다.
if [ -e $HOME/.bash_functions ]; then
source $HOME/.bash_functions
fi
함수 파일에 다음 코드를 추가합니다.
function cl() {
DIR="$*";
# if no DIR given, go home
if [ $# -lt 1 ]; then
DIR=$HOME;
fi;
builtin cd "${DIR}" && \
# use your preferred ls command
ls -F --color=auto
}
함수를 Bash 세션에 불러온 뒤 직접 사용해 보세요.
$ source ~/.bash_functions
$ cl Documents
foo bar baz
$ pwd
/home/seth/Documents
$ cl ..
Desktop Documents Downloads
[...]
$ pwd
/home/seth
함수는 별칭보다 훨씬 유연하지만, 그 유연성만큼 코드가 올바르게 작동하고 예상대로 동작하는지 책임져야 합니다. 별칭은 단순함을 지향하므로 쉽고 실용적으로 유지하세요. Bash 동작에 대한 본격적인 변경이 필요하다면 함수를 사용하거나 PATH에 등록된 위치에 커스텀 셸 스크립트를 저장하는 것이 좋습니다.
참고로, cd 후 ls 시퀀스를 별칭으로 구현하는 영리한 편법들도 실제로 존재합니다. 충분한 인내심만 있다면 소박한 별칭만으로도 가능성은 무궁무진합니다.
별칭과 함수로 시작하기
자신만의 환경을 커스터마이징하는 것이야말로 리눅스를 즐겁게 만드는 요소이고, 효율을 높이는 것이 리눅스 생활을 획기적으로 바꾸는 열쇠입니다. 간단한 별칭부터 시작해 함수로 발전시켜 나가고, 여러분의 필수 별칭을 댓글로 공유해 주세요!