GNU/Linux 시스템을 최대한 활용하려면 명령 프롬프트와 셸 스크립트에 대한 이해가 여전히 필수적입니다. 명령줄에서 작업할수록 실제로 사용하는 대부분의 명령이 전체 사용 가능한 명령 중 아주 작은 일부에 불과하다는 사실을 깨닫게 됩니다. 대부분의 작업은 습관적으로 처리되며, 사용자는 매일 같은 방식으로 동일한 명령을 반복해서 입력하게 됩니다.
많은 명령 유틸리티 개발자들은 불필요한 타이핑을 줄이기 위해 이름을 짧게 줄였습니다. 예를 들어 'list' 대신 ls를, 'change-directory' 대신 cd를 입력하는 식입니다. 그럼에도 불구하고 많은 리눅스 사용자들은 동일한 명령을 계속해서 반복해야 하는 상황에 직면합니다. 같은 명령을 일일이 입력하거나 복사·붙여넣기를 반복하면 생산성이 떨어지고 정작 중요한 작업에 집중하기 어려워집니다.
긴 명령어를 입력하는 데 드는 시간을 줄일 수 있다면 얼마나 좋을까요? 명령줄에서 시간을 절약하는 강력한 두 가지 방법이 바로 셸 별칭(alias)과 셸 함수(function)입니다. 이 두 가지를 활용하면 반복적인 작업을 자동화하고, 긴 프로세스를 단축하며, 항상 사용하지만 매번 기억하기 어려운 옵션까지 포함한 나만의 맞춤형 명령을 만들 수 있습니다.
별칭과 셸 함수란 무엇인가?
별칭과 셸 함수(즉, 셸 스크립트)는 비슷한 역할을 수행합니다. 둘 다 Bash 셸 기능의 집합을 정의하고 이름을 붙인 후, 그 이름만 호출하면 실행되도록 해줍니다. 매번 모든 단계나 명령을 입력하는 것보다 이름 하나만 입력하는 것이 훨씬 쉽고 편리합니다.
별칭과 함수의 차이는 복잡성과 규모에 있습니다. 스크립트(함수)는 더 길고 정교한 코드 덩어리를 담기에 적합하고, 별칭은 짧고 간결한 명령 집합을 담기에 완벽합니다.
셸 별칭(Shell Alias)
셸 별칭은 명령 또는 명령 집합을 커스텀 옵션과 함께 또는 없이 실행하기 위한 사용자 지정 바로가기입니다. 자주 실행해야 하는 긴 명령어에 붙이는 기억하기 쉬운 대체 이름이라고 생각하면 됩니다. 명령줄에 무언가를 입력하면 셸은 먼저 자신의 별칭 목록에서 해당 내용을 찾습니다. 일치하는 항목이 발견되면 별칭이 해당 텍스트로 치환된 후, 완성된 전체 명령줄을 다시 확인하고 실행합니다.
사실 여러분은 이미 리눅스 시스템에서 별칭을 사용해 보았을 가능성이 높습니다. 대부분의 리눅스 배포판은 사용자 계정의 .bashrc 파일에 인기 있는 별칭 몇 가지를 기본적으로 추가해 두기 때문입니다.
별칭을 넘어서: 셸 함수
유사하지만 완전히 동일하지 않은 코드 블록은 별칭으로 대체할 수 없습니다. 별칭은 오류 처리나 사용자 지정 종료 코드 반환, 흐름 제어, 변수 사용이 불가능합니다. 이러한 기능이 필요하다면 이제 셸 함수를 사용할 때입니다.
셸 함수는 완전한 하위 스크립트 형태로 구조화된 코드 블록으로, 한 번 작성해 두면 필요한 모든 스크립트에서 호출하여 사용할 수 있습니다.
별칭 문법
Bash에서 별칭을 만드는 것은 매우 간단합니다. 기본 문법은 다음과 같습니다:
alias alias_name="command_to_run"
현재 세션에서 새 Bash 별칭을 생성하는 순서는 다음과 같습니다:
- alias 키워드를 입력합니다.
- 별칭 이름을 선언합니다.
- 등호(=)를 붙입니다.
- 별칭이 호출될 때 실행될 명령을 입력합니다.
명령은 반드시 따옴표로 묶어야 하며, 등호 주변에는 공백이 있으면 안 됩니다. 공백이 있으면 명령이 깨집니다. 각 별칭은 새 줄에 선언해야 합니다.
실습: ll 별칭 만들기
예제를 통해 살펴보겠습니다. 리눅스 명령줄에서 가장 많이 사용되는 명령 중 하나가 ls입니다. 대부분 ls 명령은 숨김 파일까지 포함해 모든 파일과 디렉터리를 긴 목록 형식으로 출력하는 -la 스위치와 함께 사용됩니다. 이번에는 ls -la 명령의 바로가기가 되는 간단한 Bash 별칭 ll을 만들어 보겠습니다.
- 터미널 창을 엽니다.
- 다음을 입력하고 Enter 키를 누릅니다:
alias ll="ls -la"
- 콘솔에 ll을 입력하고 Enter 키를 누릅니다.
- ls -la를 직접 입력했을 때와 동일한 결과가 출력됩니다.
위에서 정의한 별칭 'll'은 현재 셸 세션에서만 사용할 수 있습니다. 세션을 닫거나 다른 터미널에서 새 세션 창을 시작하면 이 별칭은 더 이상 사용할 수 없습니다. 별칭을 영구적으로 유지하는 방법은 뒤에서 다루겠습니다. 여기의 예제는 Bash 셸 기준이지만, 모든 개념과 대부분의 코드는 다른 셸에서도 유효합니다.
미리 정의된 별칭 확인하기
일부 별칭은 시스템에 미리 정의되어 있습니다. 시스템에 정의된 모든 별칭 목록을 확인하려면 매개변수 없이 alias 명령을 사용합니다:
alias
위 명령은 이 글을 작성하며 테스트한 우분투 머신의 별칭 목록을 보여줍니다. 물론 사용자가 직접 정의한 별칭도 이 목록에 함께 표시됩니다.
ls 명령에 대한 다양한 별칭들이 있고, grep 계열 명령에 컬러 출력을 제공하는 별칭 그룹도 있습니다. 예를 들어 위와 같이 별칭이 정의되어 있다면, 다음을 입력할 때마다:
grep
자동으로 아래처럼 해석됩니다:
grep --color=auto
여기서 별칭의 중요한 특징 하나를 알 수 있습니다. 별칭은 기존 명령과 같은 이름을 가질 수 있으며, 심지어 원래 명령 자체를 포함할 수도 있습니다.
grep 별칭의 정의는 다음과 같습니다:
alias grep='grep --color=auto'
- alias 명령으로 별칭을 정의합니다.
- 그다음 별칭의 이름을 지정합니다. 이 예제에서는 "grep"입니다.
- 등호가 별칭 이름과 별칭 본문(body)을 연결합니다. 아주 단순한 별칭이 아니라면 본문은 작은따옴표(')로 감싸는 것이 좋습니다.
- 별칭 본문은 명령줄에서 별칭이 사용될 때 실행되는 부분입니다.
- 이 별칭의 본문은 --color=auto 옵션과 함께 grep 명령을 호출하는 것뿐입니다.
alert 별칭: 명령 완료 알림 받기
목록 상단에는 alert이라는 다소 복잡해 보이는 별칭이 있습니다. 참고로 alert 별칭은 명령 실행이 끝났을 때 이를 알려주는 역할을 하며, 명령이 성공했는지 여부도 표시해 줍니다. 화면 상단에 그래픽 시스템 알림을 띄워줍니다.
간단한 예제를 살펴보겠습니다. sleep 명령이 5초간 대기한 후 alert 별칭이 호출됩니다. 별칭은 이전 명령의 응답을 확인하고, 히스토리 파일에서 마지막 명령을 추출한 뒤, 성공 여부를 판단하여 시스템 알림으로 결과를 표시합니다.
명령이 정상적으로 완료되면 시스템 알림의 아이콘은 작은 터미널 창 모양입니다. 오류 코드가 반환되면 빨간색 오류 아이콘이 표시됩니다.
sleep 5; alert
5초 후 다음과 같은 시스템 알림을 볼 수 있습니다. 아이콘이 작은 터미널 창 모양이라면 모든 것이 잘 진행된 것입니다. 이번에는 실패가 확실한 명령으로 다시 시도해 보겠습니다:
DoomedToFail; alert
이번에는 시스템 알림에 오류 아이콘이 나타납니다.
간단한 별칭 정의하기
앞서 살펴본 것처럼 별칭을 정의하려면 alias 명령을 사용합니다. 이번에는 clear 명령의 별명(pseudonym)을 만들어 보겠습니다. 별칭 이름은 cls로 하고, clear 명령을 호출하도록 정의합니다.
이 별칭 정의는 너무 단순해서 작은따옴표로 감쌀 필요조차 없습니다. 별칭 본문이 이보다 복잡하거나 공백을 포함한다면 작은따옴표로 감싸야 합니다. 별칭을 정의한 후, ls로 터미널에 출력을 남기고 새 별칭 cls로 화면을 지워 보겠습니다.
alias cls=clear ls -l cls
화면이 깨끗하게 지워졌습니다. 성공이지만, 안타깝게도 짧은 성공입니다. 이 별칭은 터미널 창이 열려 있는 동안에만 존재합니다. 창을 닫으면 별칭도 사라집니다.
.bashrc 파일로 별칭 영구 저장하기
미리 패키징된 별칭들이 어디에 정의되어 있는지 궁금할 수 있습니다. 바로 홈 폴더의 .bashrc 파일입니다. 이 파일은 대화형 셸(interactive shell)이 시작될 때, 즉 터미널 창을 열 때마다 읽혀지고 그 안의 명령이 실행됩니다.
홈 폴더에서 다음 명령을 입력하면 구문 강조와 함께 .bashrc 파일의 내용을 볼 수 있습니다:
gedit .bashrc
이 명령은 gedit 편집기를 실행하고 .bashrc 파일을 불러옵니다. 강조된 영역 두 곳에서 별칭이 정의된 것을 확인할 수 있습니다.
문서를 스크롤하면 별칭과 관련된 두 개의 섹션이 더 있습니다. 첫 번째는 alert 별칭의 정의이고, 두 번째는 if 문입니다. 이 if 문은 ".bash_aliases 파일이 존재하면 읽어 들여라"라는 의미입니다.
정의하려는 별칭이 몇 개뿐이라면 .bashrc 파일에 직접 추가해도 됩니다. ls 관련 별칭 섹션 아래에 넣어두면 됩니다.
반면 많은 별칭을 만들 계획이거나, 별칭을 별도 파일로 관리하고 싶다면 .bash_aliases 파일에 정의하는 것이 좋습니다. 이 방식의 장점은 두 가지입니다. 첫째, .bashrc 파일의 설정을 실수로 변경할 위험이 없고, 둘째, 별칭이 .bashrc와 분리되어 있어 새 시스템으로 쉽게 복사할 수 있습니다.
별칭 이름은 기억하기 쉽게 지어야 하며, 나중을 위해 주석을 추가하는 것도 좋은 습관입니다.
.bash_aliases 파일에 별칭 저장하기
.bash_aliases 파일은 기본적으로 존재하지 않으므로 직접 만들어야 합니다. 다음 명령으로 파일을 생성할 수 있습니다:
touch .bash_aliases
이제 파일을 편집해 몇 가지 별칭을 추가해 보겠습니다. 다음 명령은 gedit 편집기에서 .bash_aliases 파일을 엽니다:
gedit .bash_aliases
세 개의 별칭을 추가했습니다. 첫 번째는 앞서 사용한 cls 별칭입니다. 두 번째는 h로, history 명령을 호출하는 축약형입니다.
세 번째 별칭은 ftc로, "file type count(파일 유형 카운트)"를 의미합니다. 이 별칭은 좀 더 복잡하므로 작은따옴표로 감쌌습니다. 파이프(|)로 연결된 명령 체인을 사용하여, 서로 다른 파일 확장자와 디렉터리 이름의 정렬된 목록을 각 항목별 개수와 함께 출력합니다.
.bash_aliases 파일을 저장한 후 별칭이 바로 사용 가능할 것이라고 기대할 수 있지만, 그렇지 않습니다. 별칭 정의가 활성화되려면 Bash 셸이 파일을 읽어 들여야 합니다. 이 작업은 대화형 셸이 열릴 때마다 수행됩니다.
Bash 내장 명령인 마침표(.)를 사용해 파일의 명령을 읽고 실행할 수도 있습니다. .bash_aliases 파일은 .bashrc가 처리될 때 읽혀지므로, .bashrc를 호출하여 테스트하는 것이 좋습니다. 이렇게 하면 .bashrc가 .bash_aliases 파일을 제대로 호출하는지, 그리고 별칭이 정상 동작하는지 확인할 수 있습니다.
사용한 명령은 다음과 같습니다:
gedit .bash_aliases
.bash_aliases 파일을 편집합니다.
. .bashrc
.bashrc를 읽고 실행하며, 이 과정에서 .bash_aliases가 호출됩니다.
ftc
ftc 별칭을 호출합니다.
별칭이 정상적으로 응답했다면 Bash가 .bashrc와 .bash_aliases를 모두 읽었고, 새 별칭이 활성화된 것입니다. 이제 앞으로 필요할 때마다 .bash_aliases 파일에 새 별칭을 추가하면 됩니다. 어떤 작업을 한두 번 이상 반복하게 된다면 별칭으로 만들어 두는 것을 고려해 보세요.
별칭 제거하기
Bash가 별칭을 인식하지 못하고 반응하지 않도록 제거하는 명령도 있습니다. 아주 솔직한 이름의 unalias 명령입니다.
사용법은 간단합니다. Bash가 잊게 하고 싶은 별칭의 이름을 지정하면 됩니다. 앞서 만든 ll 별칭을 제거하려면 다음과 같이 입력합니다:
unalias ll
unalias는 직접 정의한 별칭뿐 아니라 미리 정의된 별칭도 제거할 수 있습니다.
시스템의 모든 별칭을 제거하려면 -a(all) 옵션을 사용합니다:
unalias -a
하지만 Bash의 "기억 상실"은 영구적이지 않습니다. 다음에 터미널 창을 열면 "잊어버린" 별칭들이 다시 돌아옵니다. 별칭을 완전히 삭제하려면 .bashrc와 .bash_aliases 파일에서 해당 정의를 제거해야 합니다.
나중에 다시 사용할 가능성이 있다면 .bashrc 파일에서 삭제하지 말고, 각 alias 줄 시작 부분에 해시(#)를 추가해 주석 처리하세요. .bash_aliases 파일을 무효화하려면 파일 이름을 변경하면 됩니다. .bashrc가 파일을 찾지 못하면 읽어 들이지 않습니다. 이 단계들을 되돌리는 것은 아주 간단합니다.
별칭을 일시적으로 우회해야 할 때도 있습니다(예: ls를 ls -a로 별칭 지정한 경우). 이럴 때는 역슬래시를 붙여 입력합니다:
\ls
그러면 별칭이 적용되지 않은 원래 명령이 실행됩니다.
alias 명령 도움말
- --help 옵션: 도움말 정보를 표시합니다.
문법
alias --help
셸 함수(Shell Functions)
때로는 하나 이상의 인수를 받을 수 있는 별칭이 필요합니다. 바로 그럴 때 Bash 함수를 사용합니다.
문법
Bash 함수를 만드는 것은 어렵지 않습니다. 다음 두 가지 형식 중 하나로 선언할 수 있습니다:
function_name () {
[commands]
}또는
function function_name {
[commands]
}두 번째 형식은 한 줄로 압축할 수 있으며, 명령 사이는 세미콜론으로 구분합니다. 마지막 명령 뒤에도 세미콜론이 반드시 필요합니다:
function_name () { command1; command2; }별칭과 마찬가지로 Bash 셸 함수도 .bashrc 파일 안에 정의할 수 있지만, 별도의 정의 파일에 넣는 것이 더 깔끔한 경우가 많습니다. .bash_aliases 파일의 관례를 따라 ".bash_functions"라는 이름으로 만들겠습니다.
이를 위해서는 .bashrc 파일이 우리의 정의 파일을 읽도록 설정해야 합니다. .bash_aliases 파일을 읽는 코드 조각을 복사해서 수정하면 됩니다. gedit를 실행하고 다음 명령으로 .bashrc 파일을 불러옵니다:
gedit .bashrc
별칭 섹션을 선택해 Ctrl+C로 복사한 후, 새 섹션을 넣고 싶은 위치에서 Ctrl+V로 붙여넣습니다. 그런 다음 ".bash_aliases"라고 되어 있는 두 곳을 ".bash_functions"로 변경하면 됩니다. 변경 사항을 저장하고 gedit를 닫습니다.
up 함수 만들기: 디렉터리 위로 이동하기
이제 .bash_functions 파일을 생성·편집하고 함수 정의를 추가해 보겠습니다:
touch .bash_functions gedit .bash_functions
빈 .bash_functions 파일이 gedit에서 열립니다. 여기에 up이라는 간단한 함수를 추가하겠습니다. up은 하나의 명령줄 매개변수(숫자)를 받아, cd ..을 그 숫자만큼 반복 호출합니다. 즉, 다음 명령을 실행하면:
up 2
up은 cd ..을 두 번 호출하여 디렉터리 트리에서 두 단계 위로 이동합니다.
함수를 정의하는 방법은 여러 가지가 있습니다. 그중 하나는 다음과 같습니다:
function up() {function이라는 단어는 선택 사항입니다. 전통을 중시한다면 사용하고, 귀찮다면 생략해도 됩니다.
함수의 각 부분을 살펴보겠습니다:
levels=$1
levels라는 변수를 만들고 첫 번째 매개변수의 값으로 설정합니다. 이 매개변수는 함수 호출 시 사용자가 제공하는 숫자입니다. $1은 "첫 번째 명령줄 매개변수"를 의미합니다.
while [ "$levels" -gt "0" ]; do
이후 루프에 진입합니다. "levels의 값이 0보다 큰 동안 루프 본문의 내용을 수행하라"는 의미입니다.
루프 본문 안에는 두 개의 명령이 있습니다:
cd ..
디렉터리 트리에서 한 단계 위로 이동합니다.
levels=$(($levels - 1))
levels를 현재 값보다 1 작은 새 값으로 설정합니다.
그다음 루프의 처음으로 돌아가 levels 값과 0을 다시 비교합니다. levels가 0보다 크면 루프 본문이 다시 실행되고, 그렇지 않으면 루프가 종료되어 done 문으로 넘어가며 함수가 끝납니다.
변경 사항을 저장하고 gedit를 닫습니다.
이제 .bashrc를 읽어 실행하면, .bashrc가 .bash_functions 파일의 명령을 읽어 실행합니다:
. .bashrc
디렉터리 트리의 특정 위치로 이동한 후 up을 사용해 상위 위치로 돌아오는 방식으로 함수를 테스트할 수 있습니다:
cd ./work/backup/ up 2
함수가 정상 동작하여 디렉터리 트리에서 두 단계 위로 이동했습니다.
type 명령으로 별칭과 함수 구분하기
별칭 모음과 함수 라이브러리가 쌓이다 보면 특정 명령이 별칭인지 함수인지 헷갈리기 쉽습니다. 이럴 때 type 명령을 사용하면 됩니다. 좋은 점은 정의 내용까지 함께 볼 수 있다는 것입니다.
ftc 별칭과 up 함수에 type을 사용해 보겠습니다:
type ftc type up
각각이 어떤 유형의 명령인지에 대한 유용한 정보와 함께 정의 내용도 확인할 수 있습니다.
지금부터 나만의 명령 모음 만들기
별칭과 함수는 명령줄 사용 속도를 획기적으로 높여줍니다. 명령 시퀀스를 단축하고, 표준 명령에 항상 사용하는 옵션을 미리 baked-in(내장)할 수 있습니다. 멋진 한 줄 명령이나 유용한 함수를 발견할 때마다 자신에게 맞게 수정·개인화한 후 .bash_aliases 또는 .bash_functions 파일에 추가하세요. 이들을 적극 활용하면 셸에서 보내는 시간이 더욱 즐겁고 단순해질 것입니다.
단, 기존 명령을 잠재적으로 파괴적인 동작으로 재정의하는 것은 주의해야 합니다. 반대로 명령을 더 안전한 변형(예: 재귀 삭제 전 항상 확인 요청)으로 별칭 지정하는 경우에도, 그것에 익숙해진 상태에서 해당 별칭이 없는 시스템을 처음 사용할 때 문제가 될 수 있습니다. 별칭으로 만들 좋은 후보를 찾으려면 히스토리에서 가장 자주 사용하는 명령을 검색해 보는 것이 좋습니다.