Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

실제로 매일 쓰게 될 Bash 히스토리 단축키 7가지

대부분의 Bash 히스토리 단축키 가이드는 사용 가능한 모든 단축키를 빠짐없이 나열합니다. 그런데 이렇게 하면 문제가 있습니다. 단축키를 한 번 써보고는 가능한 조합을 하나하나 시험해 보다가 흥미를 잃어버리고, 곧바로 일상 업무로 복귀한 뒤에는 처음 Bash를 배울 때 익힌 유명한 !! 트릭만 남기고 전부 잊어버리게 되죠.

그래서 대부분의 단축키는 결국 기억에 남지 못했습니다.

이 글에서는 제가 실제로 매일 사용하는 단축키들만 소개합니다. 이 내용은 제 저서 『Learn Bash the Hard Way』의 일부를 바탕으로 하며, 미리보기를 통해 더 자세히 살펴볼 수 있습니다.

제가 이 단축키들을 사용하는 모습을 보면 사람들이 종종 "방금 뭐 한 거예요!?"라고 묻곤 합니다. 사실 별다른 노력이나 재주가 필요한 것은 아닙니다. 다만 진짜 몸에 익히려면 일주일 동안 하루에 하나씩 연습하고, 익숙해지면 다음 단축키로 넘어가는 방식을 추천합니다. 시간을 들여 손에 익혀둘 가치가 충분합니다. 장기적으로 절약되는 시간이 상당하기 때문입니다.

1. 마지막 인자 불러오기: !$

이 글에서 딱 하나만 기억한다면 이것을 고르세요. 직전 명령의 마지막 인자를 현재 입력 줄에 치환해 넣어줍니다.

다음과 같은 상황을 생각해 봅시다:

$ mv /path/to/wrongfile /some/other/place
mv: cannot stat '/path/to/wrongfile': No such file or directory

앗, 명령어에 wrongfile이라는 잘못된 파일명을 넣었네요. rightfile을 넣었어야 했습니다.

마지막 명령을 통째로 다시 입력하면서 wrongfile을 rightfile로 고칠 수도 있지만, 그럴 필요 없이 이렇게 입력하면 됩니다:

$ mv /path/to/rightfile !$
mv /path/to/rightfile /some/other/place

그러면 명령이 정상적으로 실행됩니다.

Bash에는 같은 작업을 하는 다른 단축키도 있지만, 직전 명령의 마지막 인자를 재활용하는 이 트릭은 제가 가장 많이 쓰는 방법입니다.

2. n번째 인자 불러오기: !:2

이런 실수를 해본 적 있으신가요?

$ tar -cvf afolder afolder.tar
tar: failed to open

저를 포함한 많은 사람들이 tar(그리고 ln)의 인자 순서를 자주 헷갈립니다.

인자 순서를 섞어 썼다면 이렇게 실행할 수 있습니다:

$ !:0 !:1 !:3 !:2
tar -cvf afolder.tar afolder

그러면 체면이 살아납니다.

직전 명령의 항목들은 0부터 번호가 매겨져 있으며, !: 뒤의 숫자로 해당 항목을 불러와 치환할 수 있습니다.

물론 이 방법은 직전 명령의 특정 인자만 골라 재사용할 때도 활용할 수 있습니다.

3. 모든 인자 불러오기: !:1-$

다음과 같은 명령을 실행했다고 상상해 봅시다:

$ grep '(ping|pong)' afile

인자 자체는 맞습니다. 하지만 파일에서 ping 또는 pong을 찾으려면 grep이 아니라 egrep을 썼어야 했네요.

egrep을 입력하기 시작했는데 나머지 인자를 다시 타이핑하고 싶지 않다면, !:1-$ 단축키를 사용하면 됩니다. 이것은 직전 명령의 두 번째 인자(0부터 세므로 1번)부터 마지막($ 기호로 표현)까지 모든 인자를 불러옵니다.

$ egrep !:1-$
egrep '(ping|pong)' afile
ping

1-$를 쓸 필요는 없습니다. 1-23-9처럼 원하는 범위의 부분집합을 지정할 수도 있습니다(직전 명령에 그만큼의 인자가 있었다면요).

4. n개 이전 명령 참조하기: !-2:$

앞선 단축키들은 직전 명령을 어떻게 고쳐야 할지 즉시 알 때 유용하지만, 원래 명령을 실행한 후에 다른 명령을 여러 개 실행하는 경우가 많습니다. 그러면 마지막 명령이 더 이상 참조하려는 명령이 아니게 되죠.

앞서의 mv 예시에서, 실수 직후 폴더 내용을 확인하려고 ls를 실행했다고 해봅시다:

$ mv /path/to/wrongfile /some/other/place
mv: cannot stat '/path/to/wrongfile': No such file or directory
$ ls /path/to/
rightfile

이제는 !$ 단축키를 쓸 수 없습니다.

이럴 때는 ! 뒤에 -n:(n은 히스토리에서 거슬러 올라갈 명령 수)을 붙여서 더 오래된 명령의 마지막 인자를 가져올 수 있습니다:

$ mv /path/to/rightfile !-2:$
mv /path/to/rightfile /some/other/place

역시, 한번 익히고 나면 생각보다 자주 필요하다는 사실에 놀라게 될 겁니다.

5. 폴더 경로만 추출하기: !$:h

겉보기에는 별로 쓸모 없어 보이지만, 저는 하루에도 수십 번씩 사용하는 단축키입니다.

다음과 같은 명령을 실행했다고 상상해 봅시다:

$ tar -cvf system.tar /etc/system
tar: /etc/system: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.

가장 먼저 하고 싶은 일은 /etc 폴더로 이동해서 무엇이 들어 있는지 확인하고 무엇을 잘못했는지 파악하는 것일 겁니다.

다음과 같이 한 번에 처리할 수 있습니다:

$ cd !$:h
cd /etc

이 단축키는 "직전 명령의 마지막 인자(/etc/system)를 가져와서 마지막 파일명 구성 요소를 떼어내고 /etc만 남겨라"라는 의미입니다.

6. 현재 줄 참조하기: !#:1

수년 동안 현재 입력 중인 줄의 인자를 참조할 수 있는지 가끔 궁금해하다가, 마침내 찾아보고 배웠습니다. 훨씬 일찍 알았더라면 좋았을 걸 후회됩니다. 저는 주로 백업 파일을 만들 때 사용합니다:

$ cp /path/to/some/file !#:1.bak
cp /path/to/some/file /path/to/some/file.bak

손에 익으면 다음에 소개할 방법의 아주 빠른 대안이 되기도 합니다…

7. 검색 후 치환하기: !!:gs

이 단축키는 참조된 명령 전체를 검색해서 첫 번째 슬래시(/) 두 개 사이의 문자열을 두 번째 슬래시 두 개 사이의 문자열로 바꿔줍니다.

s 키가 고장 나서 f를 출력한다고 세상에 알리고 싶다고 해봅시다:

$ echo my f key doef not work
my f key doef not work

그런데 사실 f 키를 실수로 눌렀다는 걸 깨달았습니다. 모든 f를 s로 바꾸려면 다음과 같이 입력하면 됩니다:

$ !!:gs/f /s /
echo my s key does not work
my s key does not work

단일 문자뿐 아니라 단어나 문장도 바꿀 수 있습니다:

$ !!:gs/does/did/
echo my s key did not work
my s key did not work

직접 시험해 보기

이 단축키들을 조합하면 어떻게 되는지 보여드리기 위해, 다음 명령들이 무엇을 출력할지 맞혀보실 수 있겠나요?

$ ping !#:0:gs/i/o
$ vi /tmp/!:0.txt
$ ls !$:h
$ cd !-2:h
$ touch !$!-3:$ !! !$.txt
$ cat !:1-$

맺음말

Bash는 일상적인 커맨드라인 사용자에게 우아한 단축키의 보고입니다. 배울 수 있는 팁과 트릭은 수천 가지가 있지만, 이것들은 제가 자주 활용하는 가장 좋아하는 것들입니다.

Bash가 가르쳐 줄 수 있는 것들을 더 깊이 파고들고 싶다면 제 책 『Learn Bash the Hard Way』를 읽거나 온라인 강좌 Master the Bash shell을 확인해 보세요.

이 글은 Ian의 블로그 Zwischenzugs.com에 처음 게재되었으며, 허락을 받아 재게시했습니다.