bash의 별칭(alias)은 본래, 긴 명령어들을 치지 않기 위한 키보드 단축키나 약어일 뿐입니다. 예를 들어, ~/.bashrc 파일에 alias lm="ls -l | more"라고 적어주면 명령어줄에서 lm이라고 칠 때마다 자동으로 ls -l | more로 바뀝니다. 이렇게 하면 명령어 행에서 엄청난 타이핑을 줄일 수 있고 아주 복잡한 명령어나 옵션의 조합들을 일일이 다 기억하고 있지 않아도 됩니다. alias rm="rm -i"(지울 때 물어보기 모드)라고 세팅해 놓으면 중요한 파일을 실수로 지워버리지 않게 하기 때문에 큰 사고를 막아 줍니다.
스크립트에서는 별칭(alias)이 제한된 쓰임새를 갖습니다. 별칭에 매크로 확장같은 C 전처리기(preprocessor)기 같은 기능이 있었다면 아주 좋았을텐데, 불행하게도 Bash는 별칭에 속한 인자들을 확장하지 않습니다. [1] 게다가, if/then문, 루프, 함수같은 "복합문"(compound construct)안에서는 별칭 자체의 확장이 되질 않습니다. 아마 거의 항상 그럴테지만, 별칭으로 무엇을 하려던 간에 함수에서 구현하는 것이 더 효과적일 것입니다.
예 24-1. 스크립트에서 쓰이는 별칭(alias)
#!/bin/bash # 오래된 시스템에서는 #!/bin/bash2 라고 해야 됩니다. shopt -s expand_aliases # 이 옵션을 꼭 써야 별칭을 확장시킬 수 있습니다. # 먼저 재미로 하나 해보죠. alias Jesse_James='echo "\"Alias Jesse James\" was a 1959 comedy starring Bob Hope."' Jesse_James echo; echo; echo; alias ll="ls -l" # 별칭을 정의하려면 작은따옴표(')나 큰따옴표(") 중 하나를 써야 됩니다. echo "별칭인 \"ll\" 해보기:" ll /usr/X11R6/bin/mk* #* 잘 됩니다. echo directory=/usr/X11R6/bin/ prefix=mk* # 와일드 카드가 문제를 일으키는지 한 번 봅시다. echo "Variables \"directory\" + \"prefix\" = $directory$prefix" echo alias lll="ls -l $directory$prefix" echo "별칭인 \"lll\" 해보기:" lll # /usr/X11R6/bin 에서 mk 로 시작하는 모든 파일들의 모든(long) 정보를 보여줍니다. # 별칭은 와일드 카드를 포함한 변수의 연결을 잘 처리합니다. TRUE=1 echo if [ TRUE ] then alias rr="ls -l" echo "별칭 \"rr\" 을 if/then 문 안에서 해보기:" rr /usr/X11R6/bin/mk* #* 에러 메세지가 나옵니다! # 별칭은 복합문 안에서 확장되지 않습니다. echo "하지만, 이미 확장된 별칭은 인식합니다:" ll /usr/X11R6/bin/mk* fi echo count=0 while [ $count -lt 3 ] do alias rrr="ls -l" echo "별칭 \"rrr\" 을 \"while\" 루프안에서 해보기:" rrr /usr/X11R6/bin/mk* #* 역시 확장되지 않습니다. let count+=1 done echo; echo alias xyz="cat $1" # 별칭에서 위치 매개변수 시도. xyz # Bash 문서는 이런 시도를 하지 말라고 제안하고 있습니다만, # 이 스크립트에 파일명을 줘서 돌리면 제대로 되는것처럼 보입니다. exit 0 |
참고: unalias 명령어는 이전에 세팅되어 있던 별칭을 지워줍니다.
예 24-2. unalias: 별칭을 설정, 해제하기
#!/bin/bash shopt -s expand_aliases # 별칭 확장을 킴. alias llm='ls -al | more' llm echo unalias llm # 별칭을 해제. llm # 'llm'이 더 이상 인식되지 않기 때문에 에러 메세지가 나옵니다. exit 0 |
bash$ ./unalias.sh total 6 drwxrwxr-x 2 bozo bozo 3072 Feb 6 14:04 . drwxr-xr-x 40 bozo bozo 2048 Feb 6 14:04 .. -rwxr-xr-x 1 bozo bozo 199 Feb 6 14:04 unalias.sh ./unalias.sh: llm: command not found |
[1] | 하지만 위치 매개변수는 확장하는 것처럼 보입니다. |