키 (Key)
Shell에서 사용하는 키는 사용자가 설정하거나 실행되고 있는 프로그램, 터미널 앱 종류에 따라 동작이 달라질 수 있습니다. 따라서 이제부터 나올 설명과 다르게 동작할 수 있다는 점, 기억해주세요.
아참, 각 키에 표시한 * 표식은 매우 빈번하게 사용하니 외워두길 권장한다는 뜻이예요.
자동 완성
탭 키(tab key) *
명령어, 파일 이름, 경로 등을 자동으로 완성해줍니다. 예를 들어, cd Docu를 입력하고 탭 키를 누르면 cd Documents/로 자동 완성되죠. 일일이 이름 전체를 입력하지 않아도 되어 편하고, 오타 칠 여지를 없애주며, 특히 공백처럼 역 슬래시(\)로 이스케이프(escape) 처리해줘야 하는 문자도 자동으로 처리해주어 유용해요. Shell에서 아주 많이 사용하는 키죠.
커서 이동
방향키로도 커서 이동을 할 수 있지만, 커서 이동 키 조합을 활용하면 더 쾌적하게 이동할 수 있어요. 예를 들어, 100글자짜리 명령 줄에서 50번째 글자를 수정하는 경우지요.
Ctrl + A 키 조합
커서를 현재 라인의 시작으로 이동시킵니다.
WezTerm을 사용하는 경우, WezTerm용 단축키 조합을 사용하기 위한 시작키(Leader key)로 Ctrl + A를 사용해요. 그래서 위 키 중에서 Ctrl + A가 동작하지 않을 수 있는데, 이 경우, 맥OS에서는 Ctrl + Cmd + A 를 누르면 됩니다.
Ctrl + E 키 조합 *
커서를 현재 라인의 끝으로 이동시킵니다.
Ctrl + F 키 조합
한 글자 앞으로 커서를 이동시킵니다. 여기서 앞은 맨 마지막 글자가 있는 방향, 즉 오른쪽 방향이죠. 보통은 오른쪽 방향키(→)와 동일한 동작입니다. 헷갈리죠? forward로 기억하시면 나을 거예요.
Ctrl + B 키 조합
한 글자 뒤로 커서를 이동시킵니다. 여기서 뒤는 맨 처음에 입력한 글자가 있는 방향, 즉 왼쪽 방향이죠. 보통은 왼쪽 방향키(←)와 동일한 동작입니다. 방향이 헷갈린다면 backward로 기억하시면 나을 거예요.
Alt + F 키 조합 *
커서를 한 단어 앞으로 이동시킵니다. 여기서 단어란 띄어쓰기로 구분된 문자열이고요. 맥OS에서는 Alt키 대신 Option키를 사용해요.
일부 터미널 앱에서는 Esc를 누른 후 B를 누르는 것으로 동작할 수 있어요.
Alt + B 키 조합 *
커서를 한 단어 뒤로 이동시킵니다. Alt키 대신 Option키를 사용해요.
마찬가지로 일부 터미널에서는 Esc를 누른 후 F를 누르는 것으로 동작할 수 있어요.
이전 기록 검색
상 방향키(↑), 하 방향키(↓) 키 *
실행한 명령 줄을 최근 순으로 선택해줍니다. 마치 복사해서 붙여넣은 것처럼요. 예를 들어, 명령 줄을 다음과 같이 차례대로 실행했다고 치죠.
-
ls
-
ls -al
-
cd ~
이 상태에서 윗쪽 방향키를 누르면 cd ~가 프롬프트에, 또 한 번 누르면 ls -al가 프롬프트에, 또 한 번 누르면 ls가 프롬프트에 표시되지요. 하 방향키를 누르면 반대 방향으로 진행해요. 긴 명령줄을 재사용하기에 좋죠. 탭 키와 마찬가지로 아주 많이 사용해요.
각각 Ctrl + P와 Ctrl + N 키 조합으로도 동일하게 동작해요.
Ctrl + R 키 조합 *
명령어 히스토리 검색을 활성화합니다. 이전에 사용했던 명령어들 중에서 검색어에 맞는 명령어를 쉽게 찾을 수 있죠. 이 기능을 실행하면 이전에 실행한 명령어들이 나열되고, 프롬프트가 > 모양으로 바껴요. 이 프롬프트 상태에 입력하면 바로 바로 입력한 텍스트와 맞는 명령줄이 나열돼요.
ESC 키를 누르면 종료됩니다.
명령 줄 편집
Ctrl + U 키 조합 *
커서 위치가 있는 명령 줄의 텍스트를 삭제해요. 터미널 앱이나 설정에 따라서는 커서 위치부터 라인 시작까지의 텍스트를 삭제하는 동작을 하기도 합니다.
Ctrl + K 키 조합
커서 위치부터 라인 끝까지의 텍스트를 삭제합니다.
Ctrl + W 키 조합 *
커서 뒤의 단어를 삭제합니다. 헷갈릴 수 있으니 다시 상기시켜드리면, 여기서 뒤는 맨 처음 입력한 글자가 있는 방향이예요.
기타
Ctrl + L 키 조합 *
터미널 화면에 표시된 텍스트를 청소해요. 실제로 터미널의 내용을 삭제하지는 않고, 화면을 깨끗하게 보이도록 하는 거죠.
Ctrl + Z 키 조합 *
현재 실행 중인 프로세스(실행 중인 프로그램)를 일시 중지시키고, 백그라운드로 보냅니다. 백그라운드로 보낸다는 건, 프로세스를 종료하지 않고 뒤에 잠시 놓아두고, 앞이라고 할 수 있는 Shell 프롬프트로 빠져 나온다는 의미예요.
백그라운드로 보내놓은 상태에서 fg 명령어를 실행하면 백그라운드로 보내놓은 프로세스로 되돌아가요. 백그라운드로 보낸 프로세스가 여러 개라면 fg 명령어를 실행할 때마다 백그라운드에 보낸 역순으로 돌아가요.
Ctrl + C 키 조합 *
현재 실행 중인 명령어나 프로세스를 종료해요. Shell을 자주 사용하는 사람을 관찰하다보면, 가끔 황급히 Ctrl 키를 누른 채 C키를 연타하는 모습을 볼 수 있어요. 😭
기호 문자
Shell에서 몇 몇 기호 문자는 특별한 기능을 합니다. 자주 사용하는 빈도순으로 알아보죠.
애스터리스크, 별표(*)
파일 이름이나 패턴 매칭에 사용돼요. 예를 들어, ls *.txt는 .txt 확장자를 가진 모든 파일을 나열하죠.
파이프(|)
한 명령어의 출력을 다른 명령어의 입력으로 전달합니다. 예를 들어, ls | grep 'txt'는 현재 디렉토리 내의 파일들 중 'txt'를 포함하는 파일 이름만을 출력합니다.
백슬래시(\)
특수 문자를 리터럴 문자로 사용할 때 이스케이프 문자로 작동합니다. 예를 들어, echo "Line1\nLine2"에서 \n은 새 줄을 의미하지만, echo "Line1\nLine2"는 \n 문자열을 그대로 출력합니다.
세미콜론(;)
한 줄에 여러 명령어를 연속해서 실행할 때 사용합니다. 예를 들어, cd directory; ls는 directory로 디렉토리를 변경한 후, 그곳에 있는 파일들을 나열합니다.
더블대시(--)
더블대시만 단독으로 사용하는 경우, 명령어의 옵션이 끝나는 지점이라는 표식 역할을 해요. 대개 옵션은 - 기호나 -- 기호를 옵션명의 두문자로 사용하는데요. 어떤 명령어에 전달하는 인자 자체가 - 기호처럼 옵션의 구분자를 사용하는 경우가 있어요.
예를 들어, 파일명이 -rf인 파일을 삭제한다고 가정할게요.
이 명령어는 rm 명령어의 옵션인 -rf를 의미하는 것인지 삭제할 파일의 이름인 -rf인지를 구분하지 못하는 상황에 처해요. rm 명령어는 옵션으로 인식하기 때문에 -rf 파일을 삭제하지 못하죠. 이럴 때에 -- 기호를 사용합니다.
-- 기호를 사용해 rm 명령어의 옵션이 더이상 없다고 표시하였으니 뒤에 있는 -rf를 인자로, 즉 삭제할 대상으로 인식해요. 주의해야 할 점은 -- 문자 바로 뒤에 공백이 있어야 해요. 공백이 없으면 긴 이름 옵션을 구분할 때 사용하는 --와 구분이 되지 않거든요.
큰 따옴표, 더블 쿼트(")와 작은 따옴표, 싱글 쿼트(')
문자열을 정의할 때 사용됩니다. 더블 쿼트는 변수의 값을 확장하지만, 싱글 쿼트는 문자열을 그대로 처리합니다. 예를 들어, echo "$HOME"은 홈 디렉토리 경로를 출력하지만, echo '$HOME'은 문자열 $HOME을 출력합니다.
달러($)
$ 문자는 상황에 따라 각기 다른 역할을 하지만, 여기에서는 변수와 관련된 기능을 소개할게요. $ 문자는 문자열을 변수의 이름으로 사용할 수 있게 해줘요. 예를 들어, 환경변수 중에는 HOME이라는 이름을 가진 변수가 있어요. 이 변수에 할당된 값을 출력하면 현 사용자의 홈 디렉터리 절대 경로가 출력돼요.
물음표(?)
단일 문자를 대체하는 와일드카드예요. 예를 들어, ls file?.txt는 file1.txt, fileA.txt와 같이 한 문자만 다른 파일을 나열합니다.
백틱 (`)
명령어 치환(command substitution)에 사용돼요. 백틱 안에 쓰인 명령어의 출력을 다른 명령어의 입력으로 사용할 수 있어요.
위 명령어는 크게 두 단계로 구분되어 실행돼요.
-
백틱 안에 있는 명령어를 실행
-
1단계에서 출력한 결과를 ls -al의 인자로 전달
즉, 다음과 동일합니다.
꺾쇠 괄호 (<, >)
꺾쇠 괄호는 리다이렉션(redirection) 동작에 사용돼요. 꺾쇠 괄호 문자 왼쪽엔 명령어를, 오른쪽엔 리다이렉션을 받을 대상인 파일을 명시하지요.
먼저 > 문자는 명령어의 표준출력(stdout)을 오른쪽 대상으로 전달해요. 예시에서는 list.txt 파일로 보내는 것인데, 기존 내용을 초기화하고 새로 내용을 채워넣어요.
>>와 같이 연속으로 꺾쇠 괄호를 두 개 나열하면 표준출력으로 전달되는 내용을 대상 파일에 추가해요. 대상 파일이 없으면 새로 만들어서 채워넣고, 있으면 뒤에서부터 추가하는 거죠.
꺾쇠 방향이 반대인 <는 오른쪽에 있는 파일을 표준입력(stdin)으로 왼쪽에 있는 명령어에 보내요. 자주 사용하는 편은 아니예요.
마지막으로 2>도 있는데, 표준에러(stderr)를 전달해요. Shell 프로그램이 동작 중 에러 메시지를 표준에러 장치로 출력하면 사용자는 표준에러 장치로 에러(오류)만 출력해 볼 수 있는 거죠.
좌방향 이중 꺾쇠 괄호(<<)
좌방향 이중 꺾쇠(<<)는 우방향 이중 꺾쇠 괄호인 >> 와 전혀 다른 동작을 해요. <<는 히어 도큐먼트(Here document)라는 기능을 수행하는데, 한 줄보다 많은 줄로, 즉 여러 줄에 걸쳐 데이터나 스크립트 문자열을 담을 때 유용해요. 이 기능이 없으면 역 슬래시(\) 문자를 이용해 다음 줄에 계속 이어진다는 표식을 남겨야 하죠.
히어 도큐먼트 기호가 있는 명령 줄을 실행하면 히어 도큐먼트를 입력받는 프롬프트로 바뀌죠. heredoc>이 바로 변경된 프롬프트예요. 이 프롬프트 상태에서 엔터를 누르면 명령 줄을 실행하는 게 아니라 다음 줄 입력을 받는 프롬프트가 이어져요.
EOF는 히어 도큐먼트 시작과 끝에 표식 역할을 하는 구분자예요. 관례처럼 EOF를 많이 쓰는데, 시작과 끝지점이 일치하면 다른 문자열로 해도 되지요.