목록으로
키 (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를 많이 쓰는데, 시작과 끝지점이 일치하면 다른 문자열로 해도 되지요.
푸딩캠프 뉴스레터를 구독하면 학습과 성장, 기술에 관해 요약된 컨텐츠를 매주 편하게 받아보실 수 있습니다.
목차