alias: 나만의 쉘 커맨드 만들기
들어가며
쉘 프로그래밍 카테고리의 지난 포스트들에서 기존에 정의되어 있던 많은 명령어들을 살펴봤다. 지금까지 살펴 본 영역은 그 많은 쉘 커맨드들의 빙산의 일각에 불과하지만 중요성만큼은 T.O.P인 기능들 위주로 다루려고 했다. 실제로 어느 정도 성공했고 더 살펴봐야 할 기능들이 많지만 지금까지 다룬 부분만 알아도 기본적인 CLI 컴퓨터 생활은 영위할 수 있다.
하지만 인간의 욕심은 끝이 없고, 할 수 있는 것보다 더 많은 것을 알고 싶어하고 하고 싶어한다. 지금까지는 정해진 기능들만 썼는데 내가 기능을 만들어볼 수는 없을까? 즉, 쉘 커맨드에서도 Customization이 가능할까? 물론, 가능하다. CLI는 GUI에 비해 훨씬 어렵지만, 항상 말하듯이 난이도와 자유도는 같이 가는 것 아닌가? 어려운 대신 당신이 상상하는 그 이상을 가능케한다. 그러니까 결론은 나만의 기능을 만들 수 있다. 오늘 포스트는 그것에 대한 것이다.
쉘에서 나만의 기능을 만든다는 것은 구현할 수 있는 기능의 범위가 상상을 초월한다. 이후에 쉘 스크립트를 배운다면 ‘실제 정교한 프로그램’ 수준의 커맨드를 만들 수도 있다. 하지만 우리는 지금 그 정도 실력은 안 되기 때문에 그보다는 쉬운, 대신 제한적인 방법을 배울 것이다. 그 기능이 제한적이지만 매우 쉽기 때문에 매우 유용하다는 것을 알게 될 것이다.
alias: 나만의 명령 만들기
쉘 커맨드에는 alias
라는 명령이 있다. alias
는 ‘일명’, ‘가명’이라는 뜻으로 다른 명령어(들)의 별칭을 만들 수 있다. 다시 말해, 다른 다수의 명령어 조각을 하나의 명령어 조각으로 별칭을 만드는 역할을 할 수 있다. 이게 무슨 말이냐. 예를 들어보자.
git을 쓴다면 커밋을 만들기 위해 ‘git add’와 ‘git commit’을 기계적으로 쓰고 있을 것이다. 물론 각 명령에는 중요한 의미가 있지만 게으른 개발자라면 항상 같이 쓰이는 저 두 명령어를 한 명령어로 처리한다든가, ‘git add’는 7바이트나 써야 하기 때문에 ‘ga’와 같이 줄여 쓸 수 있을까를 고민할 수 있다. 위 두 경우에 모두 alias 를 사용하기 딱 좋은 경우다.
alias 의 사용 방법은 다음과 같다.
$ alias 명령어이름='줄일 코드조각'
alias 명령어에 빈칸을 두고 새로 만들 명령어 이름을 입력한다. 그리고 ‘=’를 입력하고 따옴표 안에 줄일 코드 조각을 입력한다. 이때 코드 조각이 여러 개라면 ‘;’를 구분자로 입력한다. 이때 ‘=’ 양 옆에는 빈 칸이 있으면 안 된다.
바로 예를 살펴보자.
$ alias ll='ls -l' # 1.
$ alias ga='git add' # 2.
$ alias gg='git add; git commit' # 3.
1번과 2번은 한 명령어를 짧게 줄인 경우를 보여준다. ‘ls -l’은 파일의 정보를 자세하게 살펴볼 때 사용하는데 그대로 입력하면 빈칸을 포함해 5바이트를 써야 한다. 이 명령어의 사용빈도와 중요성을 생각할 때 적지 않은 데이터 소비이고, 이때 위와 같이 줄이면 5바이트 대신 ‘ll’, 2바이트만으로 기능을 실행할 수 있다. 2번도 마찬가지이다.
3번은 두 개 이상의 명령어를 한 개로 줄인 경우이다. 명령어들은 ‘;’로 구분되는데, 쉘은 한 줄로 명령어를 구분하기도 하지만 동시에 한 줄 내에서 ‘;’ 구분자의 양옆을 독립된 명령어로도 처리한다. 확인하고 싶다면 쉘에 ‘ls; echo hi; whoami’를 한 줄에 입력해보자.
위와 같이 해서 두 개 이상의 명령어도 쉽게 2바이트의 명령어로 줄일 수 있었다. 기계적으로 반복작업하는 명령어를 간편화할 때 좋다.
위와 비슷한 예제를 만들어서 실제로 활용해보자. 아마 놀랍도록 쉽다는 것을 알 수 있을 것이다. 여기에 파이프라인 연산자 등까지 사용하면 더욱 강력해질 것이다. 내가 자주 반복적으로, 연속적으로 사용하는 명령어들이 있다면 alias 를 사용해서 별칭을 만드는 것을 추천한다.
alias 를 사용할 때 주의할 점이 있다. 그것은 내가 만든 별칭이 기존의 명령어를 뒤집어 쓰지 않도록 주의하라는 것이다. 쉘에는 우리가 다 알 수 없는 정말 많은 명령어가 있기 때문에 아무 생각없이 별칭을 만들면 그것을 뒤집어 쓰기 쉽다. 그러면 그 기능이 만약 필요해질 때 내가 만든 엉뚱한 기능이 등장할 수 있다. 예를 들어, 쉘에는 ‘y’를 끊임없이 출력하는 yes 라는 프로그램이 있는데 어쩌면 이런 프로그램이 있다는 것을 생각 못하고 내 기능이 뒤집어 씌울 수도 있다. 이때 내가 추천하는 것은 내가 만들려는 이름에 이 포스트에서 다룬 type 명령어로 이 이름의 명령어가 존재하는지 미리 확인하라는 것이다. 원하는 이름의 명령어가 이미 존재한다면 다른 이름을 정하고, 없으면 그 이름을 그대로 쓰면 될 것이다.
아까 이 방법은 기능이 제한적이라고 했다. 그럴 수밖에 없는 것이 alias 는 ‘별칭’이기 때문에 정말 새로운 기능을 만든다기 보다는 명령어의 연속된 조합을 짧게 줄이는 의미가 강하기 때문이다. 기존의 쉘 명령어의 영역을 벗어나는 것은 아니기 때문에 극한의 Customization을 할 수 없다. 진짜 골 때리는 기능은 나중에 쉘 프로그래밍을 배우면 할 수 있다. 일단은 여기에 만족하도록 하자.
내 명령 항시 적용하기
지금 당장은 배운 alias 로 나만의 별칭을 만들어 기분이 좋을 수 있지만, 당장 내일 컴퓨터를 다시 키기만해도 분노가 치밀어오를 것이다. 그 이유는 내가 지금 쉘로 만든 이 명령어는 이 쉘 프로세스에만 적용되기 때문에 다른 쉘 프로세스에는 적용되지 않기 때문이다. 확인하고 싶다면 새로 쉘을 다시 켜서 다른 쉘에서 만든 내 명령을 쓸 수 있는지 확인해보기 바란다. 그런 명령은 없을 것이다.
이건 예상한 바가 아니다. 우리는 당연히 만든 명령어를 앞으로도 쭉 쓸 수 있기를 바랄 것이다. 우리는 하루살이가 아니니까. 그렇다면 만든 명령어를 모든 쉘 프로세스에 적용되게 만드는 것이 필요하다. 이때는 쉘 설정파일에 우리 명령어를 입력하면 된다.
쉘도 프로그램이고 우리는 잘 모르지만 사실 다양한 쉘 프로그램이 존재한다. 하지만 따로 다른 쉘을 쓰지 않는다면 대부분의 유닉스 배포판에서는 ‘Bash Shell’(이하 배쉬 쉘)이라는 유서 깊은 쉘 프로그램을 사용한다. 기본으로 설치되어 있기 때문에 웬만하면 우리는 배쉬 쉘을 사용하고 있다. 그리고 이 배쉬 쉘은 처음 프로세스가 실행될 때, 그러니까 우리가 쉘을 킬 때, 유저 홈 디렉토리에 있는 ‘.bashrc’ 라는 설정파일의 설정목록을 적용해서 실행되는데 이 설정파일에 우리의 명령어를 입력하면 언제나 이 명령어를 사용할 수 있다.
이건 전혀 어려운 작업이 아니고, 우리가 쉘에 입력했던 alias 명령을 ‘.bashrc’ 라는 숨김파일에 입력만 하면 된다. 어떤 에디터를 쓰는지 모르겠지만, 에디터를 쓰지 않고 표준 출력을 전환해 파일에 붙여 쓰는 ‘>>’ 연산자를 사용하자. 이 내용은 쉘 Redirection 포스트에서 자세히 다루었다.
가령 위의 3번 코드를 모든 쉘 프로세스에 항시 적용하고 싶다면
$ echo "alias gg='git add; git commit'" >> ~/.bashrc
와 같이 입력하면 된다. ~
는 홈 디렉토리를 뜻하는 확장문자로 보통은 ‘/home/유저명’을 뜻하게 되어 있다. 내 홈 디렉토리를 확인하고 싶다면 쉘에 ‘echo ~’을 입력해보자. 그리고 홈 디렉토리 안의 ‘.bashrc’라는 숨김파일에 alias 를 맨 뒤에 붙인다. 이때 ‘>>’ 대신 ‘>’를 쓰지 않도록 조심하자. 잘못하면 기존의 설정이 모두 지워질 수 있다.
이렇게 입력하면 내 명령어를 쓸 수 있을 것 같지만 바로 써지지 않는데, 그 이유는 쉘은 처음 실행될 때만 ‘.bashrc’ 파일을 읽기 때문에 이미 켜진 쉘에서는 수정 내용이 적용되지 않기 때문이다. 이때 쉘 스크립트 파일을 실행하는 source 라는 명령어를 사용해서 쉘이 ‘.bashrc’ 파일을 실행하도록 하자.
$ source ~/.bashrc
이제!! 우리가 만든 명령어를 써볼 수 있을 뿐 아니라 반영구적으로 사용할 수 있다!
마치며
오늘 포스트에서는 alias 를 사용해 나만의 별칭을 만드는 방법을 살펴보았다. 이는 꽤나 유용하기 때문에 자기가 봤을 때 자주 사용하면서 옵션을 포함해 좀 길다 싶은 명령어는 적극적으로 alias 로 별칭을 만들어보자. 나도 매일 사용하는 내용들이다.
이 포스트는 내가 지금까지 다룬 쉘 관련 포스트 중에서 제일 가벼운 내용인 것 같다. 리디렉션과 같이 엄중한 중요성의 포스트을 작성할 때는 느끼지 못하는 편안함을 느낄 수 있었다.
이제 또다시 고비가 찾아오는데 바로 확장
을 다룰 것이다. 여기는 진짜 ‘공부’가 필요하기 때문에 까다롭다. 하지만 정말정말 재밌다. 기대하자, 곧 광명을 찾을지니 :)