커맨드 라인에 편해지는 법

원문: Julia Evans, "What helps people get comfortable on the command line?"
가끔 커맨드 라인을 써야 하는 친구들과 이야기하다 보면 많은 이들이 여전히 터미널을 두려워하고 있다는 걸 느낍니다. 그럴 때마다 어떤 조언을 할지 잘 모르겠더라고요. 저는 워낙 오래전부터 터미널을 써왔기 때문이죠. 그래서 Mastodon에 이렇게 물어봤습니다.
최근 1~3년 사이에 터미널 공포(?)를 극복한 분들! 여러분에게 도움이 된 건 무엇이었나요?
(오래전부터 터미널을 편하게 써온 분들이나 기억이 잘 안 나는 분들은 굳이 답하지 않으셔도 괜찮아요. 이 질문은 그런 분들을 위한 건 아니니까요🙂)
아직 원하는 만큼 목록이 길지는 않지만 더 많은 답변을 모을 수 있기를 바라며 우선 공유해 봅니다. 당연히 모든 사람에게 효과적인 단 하나의 방법 같은 건 없으며, 사람마다 편해지는 과정도, 계기도 다르다는 걸 전제로요.
제가 생각하기에는 커맨드 라인에 익숙해지는 과정은 크게 위험 요소 줄이기, 동기 부여, 도움이 되는 자료들 이 세 가지 요소로 나뉩니다. 먼저 실수로 인한 위험 요소를 줄이는 방법부터 시작해서 몇 가지 동기 부여 요인, 그리고 참고할 만한 자료들을 차례로 정리해 보겠습니다.
위험 요소를 줄이는 법
많은 사람들이 커맨드 라인에서 되돌릴 수 없는 파괴적인 작업을 실수로 실행할까 봐 걱정합니다. 그리고 그 걱정은 매우 타당합니다!
이를 예방하기 위해 사람들이 실천하고 있는 전략들은 아래와 같습니다.
정기적인 백업 (어떤 사람은 지난주에 커맨드 라인 실수로 홈 디렉토리 전체를 삭제했지만 다행히 백업이 있어서 괜찮았다고 합니다.)
코드를 다룰 땐 최대한 git을 활용하기
rm명령어를 safe-rm이나 rmtrash 같은 도구로 별칭(alias) 처리하기 (아니면rm -i옵션 사용하기)와일드카드(*) 사용을 지양하고 탭 자동 완성으로 대체하기 (예를 들어 제 shell은
rm *.txt를 입력하면 삭제 대상 파일 목록을 보여줍니다.)터미널 프롬프트에 현재 디렉토리, 접속한 머신, git 브랜치, 루트 여부 표시
테스트되지 않거나 위험한 명령어 실행 전에 파일을 복사해 두기
백업 소프트웨어나 디스크 파티셔닝 같이 특히 위험한 테스트는 저렴한 라즈베리 파이 또는 구형 리눅스 PC 같은 전용 테스트 머신에서 실행하기
위험한 명령어에는 가능하면
--dry-run옵션을 사용하기shell 스크립트에
--dry-run옵션 기능을 직접 구현해 두기
"킬러 앱"
몇몇 사람들은 어떤 "커맨드 라인 킬러 앱" 덕분에 터미널을 더 자주 쓰게 되었다고 말했습니다. 예를 들어 아래와 같은 도구들이 그 계기가 되었습니다.
jq
wget·curl
git (일부는 GUI보다 CLI로 사용하는 게 더 편하다고 느꼈다고 합니다)
ffmpeg (영상 작업용)
(이 흥미로운 사례에서 언급된) 하드 드라이브 데이터 복구 도구들
또 어떤 사람들은 램을 다 써버리고 컴퓨터를 멈추게 만드는 대형 IDE 같이 무거운 GUI 도구에 좌절하면서 그것들을 훨씬 가벼운 커맨드 라인 도구로 대체하려는 동기를 갖게 되었다고 합니다.
영감을 주는 커맨드 라인 마법
어떤 사람은 다른 사람들이 커맨드 라인으로 멋진 작업을 해내는 걸 보고 동기부여를 받았다고 말했습니다. 예를 들면 아래와 같은 것들입니다.
explainshell
여러 사람들이 explainshell을 언급했는데 셸 명령어를 붙여 넣으면 그 구문을 여러 요소로 나누어서 쉽게 설명해 줍니다.
history, tab 자동 완성 등
커맨드 라인 작업을 훨씬 더 쉽게 만들어 주는 작은 팁과 요령들이 많이 언급되었습니다. 예를 들면 아래와 같습니다.
↑(위쪽 화살표)로 이전 명령어 확인
Ctrl+R로 bash 히스토리에서 명령어 검색
한 줄 내에서 커서 이동 및 편집 (
Ctrl+w: 단어 단위로 삭제,Ctrl+a: 줄 맨 앞으로 이동,Ctrl+e: 줄 맨 끝으로 이동,Ctrl+←·Ctrl+→: 단어 단위로 좌우 이동)bash 히스토리 용량을 무제한으로 설정
명령어
cd -로 이전 디렉토리로 이동탭 키로 파일명과 명령어 자동 완성
less와 같은 pager 도구 사용법 익히기 (man 페이지나 큰 텍스트 파일을 읽을 때 검색하고 스크롤하는 등)설정 파일 수정 전에 하는 백업
Mac OS의 경우 pbcopy·pbpaste 명령어로 클립보드와 stdin·stdout 간 복사 및 붙여넣기
Mac OS의 경우 Finder에서 폴더를 터미널로 드래그하여 경로를 자동으로 입력
fzf
많은 사람들이 shell 히스토리 퍼지(fuzzy) 검색에 더 나은 방법으로 fzf를 사용한다고 언급했습니다. 그 외에도 fzf를 활용하는 다양한 사례들이 소개되었는데요.
git 브랜치 선택하기
git checkout $(git for-each-ref --format='%(refname:short)' refs/heads/ | fzf)편집할 파일 빠르게 찾기
nvim $(fzf)Kubernetes 컨텍스트 전환하기
kubectl config use-context $(kubectl config get-contexts -o name | fzf --height=10 --prompt="Kubernetes Context> ")테스트 스위트에서 실행할 특정 테스트 선택하기
이런 사례들의 공통된 패턴은 fzf를 사용해 어떤 항목 (파일, git 브랜치, 명령줄 인자 등)을 선택하면 선택된 결과가 stdout으로 출력되어, 그 출력 결과가 다른 명령어의 인자로 사용된다는 것입니다.
또한 fzf를 통해 명령어 출력을 자동으로 미리 보기하며 반복적으로 테스트할 수도 있습니다. 예시는 아래와 같습니다.
jq 출력 결과 미리 보기
echo '' | fzf --preview "jq {q} < YOURFILE.json"sed 미리 보기
echo '' | fzf --preview "sed {q} YOURFILE"awk 미리 보기
echo '' | fzf --preview "awk {q} YOURFILE"
어떤 느낌인지 감이 오시나요?
일반적으로 사람들은 자주 쓰는 fzf 명령어 조합에 별칭(alias)을 정의해서 gcb 같은 짧은 명령어만 입력해도 git 브랜치를 빠르게 고를 수 있도록 합니다.
라즈베리 파이
몇몇 사람들은 라즈베리 파이를 사용하기 시작했다고 했습니다. 라즈베리 파이의 장점은 컴퓨터를 망가뜨릴 걱정 없이 실험할 수 있다는 것입니다. 문제가 생기면 SD 카드를 지우고 다시 시작하면 되니까요!
멋진 shell 설정
많은 사람들이 oh-my-zsh나 fish 같은 사용자 친화적인 shell 설정을 사용하면서 커맨드 라인이 더 편해졌다고 말했습니다. 저도 이 의견에 정말 동감해요. 저는 10년째 fish를 사용 중이고 아주 만족하고 있습니다.
여기에 덧붙여 할 수 있는 다른 몇 가지 방법들도 있습니다.
터미널을 더 예쁘게 꾸미면 더 편안하게 느껴졌다는 사람들도 있습니다. ("분홍색으로 만드세요!")
더 많은 정보를 보여주는 멋진 shell 프롬프트를 설정하는 방법도 있습니다. 예를 들어 명령어가 실패하면 프롬프트를 빨간색으로 바꾸는 식으로요. 특히 transient 프롬프트 기능 (현재 실행 중인 명령어에는 화려한 프롬프트를, 이전 명령어에는 훨씬 단순한 프롬프트를 보여주는 방식)이 매우 유용하다고 합니다.
터미널 테마 도구 몇 가지를 소개합니다.
저는 base16-shell을 사용합니다.
powerlevel10k는 인기 있는 멋진 zsh 테마로 transient 프롬프트 기능을 제공합니다.
starship은 화려한 프롬프트 도구입니다.
Mac에서는 기본 터미널보다 iTerm2로 더 쉬운 커스터마이징이 가능하다고 생각합니다.
고급 파일 관리자
몇몇 사람들은 ranger나 nnn처럼 터미널에서 사용할 수 있는 고급 파일 관리자를 언급했습니다. 저는 사실 이런 도구들은 처음 들어봤어요.
친구나 동료의 도움
초보적인 질문에 답해주고 방향을 잡아줄 수 있는 친구나 동료가 곁에 있다면 더없이 소중한 자원이죠.
어깨너머로 배우기
여러 사람들이 경험 많은 사람이 터미널을 사용하는 모습을 옆에서 지켜본 경험이 도움이 되었다고 말했습니다. 숙련자들은 자신도 모르게 수많은 요령들을 사용하고 있기 때문에 그런 모습을 보면서 자연스럽게 많은 걸 배울 수 있는 거죠.
별칭(alias)
많은 사람들이 말하기를, 자주 하는 작업을 위한 alias나 스크립트를 직접 만들어 썼을 때 마치 무언가를 깨달은 듯 마법 같은 "아하!" 모먼트를 경험했다고 합니다. 그 이유는 아래와 같습니다.
복잡한 명령어 구문을 매번 기억할 필요가 없어집니다.
자주 사용하는 명령어 목록이 생기기 때문에 언제든 손쉽게 꺼내 쓸 수 있습니다.
예제를 얻기 위한 치트시트
많은 man 페이지에는 예제가 없습니다. 예를 들어 openssl s_client의 man 페이지에는 예제가 전혀 없어서 시작하기가 훨씬 어렵습니다!
그래서 몇몇 사람들은 아래와 같은 치트시트 도구들을 추천했습니다.
예시로 openssl에 대한 cheat 페이지는 정말 훌륭하다고들 합니다. 실제로 제가 openssl을 사용한 거의 모든 상황이 거기에 다 들어 있었습니다. (단 하나, openssl s_client 명령에서 -servername 옵션만 빠져 있었을 뿐이라고 하네요.)
어떤 사람은 자신의 .bash_profile을 설정해서 로그인할 때마다 자동으로 치트시트를 출력하도록 했다고 합니다.
외우려고 애쓰지 마세요
몇몇 사람들은 커맨드 라인을 배울 때 접근 방식을 바꿔야 했다고 말했습니다. 처음에는 모든 명령어를 외우려고 했지만 나중에는 필요할 때마다 검색해서 쓰는 편이 훨씬 효율적이라는 걸 깨달았다는 것이죠. 자주 쓰는 명령어는 자연스럽게 반복되면서 기억된다는 걸 알게 된 겁니다.
(사실 저도 최근에 x86 어셈블리어를 공부하면서 똑같은 걸 느꼈어요. 수업을 듣고 있었는데 강사가 "처음엔 그냥 매번 찾아보세요. 자주 쓰는 명령어는 결국 알아서 외워집니다."라고 하더군요.)
반면에 정반대의 방식을 썼다는 사람들도 있었습니다. 예를 들어 Anki 같은 간격이 있는 반복 학습 앱을 사용해서 자주 쓰는 명령어들을 체계적으로 암기했다는 경우도 있었죠.
vim
어떤 사람은 커맨드 라인에서 vim을 사용해 파일을 편집하기 시작했다고 했습니다. 터미널 기반 텍스트 에디터를 사용하게 되면서 자연스럽게 다른 작업도 커맨드 라인에서 하는 게 익숙해졌다고 합니다.
또한 최근에는 micro라는 새로운 에디터도 있다고 합니다. 이 에디터는 pico나 nano보다 더 편리한 버전으로, emacs나 vim을 배우고 싶지 않은 사람들에게 적합하다고 하네요.
데스크톱에서 Linux를 사용하세요
어떤 사람은 리눅스를 메인 데스크탑 운영체제로 사용하면서 터미널을 익혔다고 합니다. 리눅스를 쓰다 보면 생기는 문제들을 직접 해결해야 했고 그 과정에서 자연스럽게 실력이 늘었다는 것이죠. 사실 저도 2004년쯤에 그렇게 터미널에 익숙해졌습니다. 여러 리눅스 배포판을 설치해 보면서 가장 마음에 드는 걸 찾으려고 열중했었죠. 다만 요즘에는 이런 방식이 그리 대중적인 접근은 아닌 것 같기도 합니다.
강제로 터미널만 사용하기
몇몇 사람들은 대학교 수업에서 교수님이 모든 작업을 터미널에서만 하도록 요구했다고 했습니다. 또 어떤 사람들은 일정 기간 동안 모든 작업을 터미널로만 하기로 스스로 규칙을 정했다고도 했습니다.
워크숍
소수의 사람들은 Software Carpentry 같은 워크숍 프로그램이 커맨드 라인에 익숙해지는 데 도움이 되었다고 말했습니다. 이 워크숍은 과학자들을 위한 커맨드 라인, Git, Python·R 프로그래밍 입문 과정을 다룹니다.
Software Carpentry 커리큘럼은 여기에서 확인할 수 있습니다.
참고 도서 및 글
아래는 사람들이 추천하는 참고 자료입니다.
글
(Unix와 Windows 커맨드 라인 팁을 섞은) 커맨드 라인 kung fu
도서
Unix 파워 도구 (다소 오래된 내용)
Linux Pocket 가이드
영상
Mindy Preston의 CLI 도구는 본래 사용하기 까다롭지 않습니다
Gary Bernhardt의 스크린캐스트, 모든 소프트웨어를 파괴하라



