24장. 별칭(Aliases)

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]

하지만 위치 매개변수는 확장하는 것처럼 보입니다.