핵심 Shell 커맨드 9개 살펴보기

핵심 Shell 커맨드 9개 살펴보기

2018, Oct 12    

들어가며


우리는 컴퓨터를 사용할 때 윈도우즈 운영체제와 같은 GUI(Graphic User Inferface)에 익숙하다. 윈도우즈 안에서는 우리는 시각적인 폴더를 클릭하고 마우스로 끌어서 휴지통에 갖다 박으며 시각적인 프로그램 아이콘을 더블클릭해 프로세스를 시작시킨다.
시각적인 요소는 호소력이 짙고 두 눈을 잘 때 빼고는 뜨고 다니는 우리에게 익숙하기 때문에 GUI는 인류의 성공적인 컴퓨터 생활 인터페이스로 자리잡았으며 윈도우 성공의 한 축을 담당했다고 생각한다.

하지만 개발을 한다면 Unix Shell(유닉스 쉘)에 익숙해져야 한다고 생각한다.

이 글은 개발을 공부하기 위해 유닉스의 계열인 iOS를 구매했거나, 나처럼 비애플 계열 제품에 우분투 등 리눅스 운영체제를 갓 이식한 사용층을 대상으로 기본적인 쉘 활용을 위한 핵심 커맨드 9가지를 소개하고자 한다.

쉘은 사실 거대한 프로그램으로서 그 기능이 무궁무진하다. 나만의 기능을 만들거나, 쉘 프로그래밍을 통해 변수 설정, 조건문, 반복문 등 일반 프로그래밍에서 했던 코딩을 그대로 해볼 수 있다.

하지만 전문 리눅스 개발자가 될 것이 아닌 이상 이 모든 것을 공부하며 살 수는 없고, 그럴 이유도 없다. 그때그때 필요한 기능을 검색하고 사용하면 되기 때문이다.

그러나 이 핵심 9가지 기능 없이는 윈도우즈에서 영위했던 기본적인 컴퓨터 운영이 불가능하다고 단언할 수 있다. 즉, 이 명령들은 쉘 활용의 기본이다. 잘해보자구!


난 이 9가지 명령어를 크게 경로 커맨드와 CRUD 커맨드로 구분했다. 경로 커맨드는 경로를 확인, 이동 등 하는 명령어 집합이며 CRUD 커맨드는 정보의 생성, 읽기, 수정, 삭제 등과 관련이 있다. 각 챕터에서 보다 구체적으로 확인해보자.

경로 커맨드


경로(path) 커맨드는 현재 경로를 확인하거나 작업할 경로를 이동하는 등의 작업을 수행하는 명령어를 포함했다. 예를 들면 윈도우즈에서 우리는 폴더를 더블클릭해가면서 원하는 파일이 있는 곳까지 이동하는 작업을 하는데 이런 작업들을 일컫는다.

file-system

유닉스에서는 경로가 ‘/’인 루트 디렉토리(윈도우즈에서는 폴더)에서 시작해서 더 많은 디렉토리와 파일들로 파일 시스템이 구성된다. 가령 ‘/sys/dev’라는 경로가 있다면 이는 ‘/’ 디렉토리 안의 ‘sys’ 디렉토리 안의 ‘dev’라는 파일을 가리키게 된다.

CLI을 사용할 때 원하는 작업을 할, 또는 원하는 파일이 있는 곳을 확인하고 이동하는 것은 중요하다.
이 포스트에서 경로 커맨드는 pwd, ls, cd를 살펴본다.

1. pwd

pwd는 ‘print working directory’의 약자로 현재 쉘 상에서 내가 위치한 디렉토리 경로를 보여준다. 본격적인 작업에 앞서 내가 현재 속한 경로를 확인해야 할 필요가 있을 때 사용한다.

이후 설명할 다른 기능들과 달리 인자(argument)도 받지 않아서 매우 단순한 기능이다.

$ pwd

> /home/sunghwanpark

‘/home’ 디렉토리는 시스템의 각 유저들의 사용공간인데, 지금은 ‘sunghwanpark’라는 유저의 사용공간에 커서가 위치하고 있다는 것을 알려준다.


2. ls

ls는 아마 쉘을 쓰면서 가장 많이 쓰는 기능이 될 것이다. 이 기능은 list의 약자로 디렉토리 안의 파일과 디렉토리의 목록을 화면에 출력한다.

활용법은 ls 경로가 기본인데, 이는 내가 입력한 디렉토리 안의 모든 파일과 디렉토리 목록을 출력한다는 것을 뜻한다. ‘ls’에 인자를 주지 않고 쓰면 현재 위치가 경로로 쓰이도록 되어 있고 현재 내가 속한 디렉토리 안의 파일 목록을 보여준다.

사용예는 다음과 같다.

$ ls

> 0906study.md   data-science-pandas  shell-scripts   다운로드
  Downloads      gitrepo              바탕화면
  archive-directory  image            test
  bin                ipython-dir

현재 내가 속한 디렉토리 안의 파일들을 모두 보여준다. 명시적으로 경로를 입력해주면 지금 내가 속한 경로가 아닌 입력된 경로의 파일들을 보여준다.

$ ls /

> bin    dev    initrd.img.old  media  root  srv  var
boot     etc    lib     mnt    run   sys  vmlinuz
cdrom    home   lib64   opt    sbin  tmp  vmlinuz.old
custom-backup  initrd.img  lost+found      proc   snap  usr

이 기능은 중요한 기능답게 수많은 옵션 인자를 갖고 있다. 이때 옵션이란 사용하는 기능에 영향을 미치는 추가적인 설정을 유저가 주는 것을 말한다. 따라서 옵션이란 커맨드에 종속적이다. 커맨드마다 쓰는 옵션이 특수하다는 것을 뜻한다.

이때 옵션은 기능과 함께 뒤에 공백을 사이에 두고 ‘-옵션명’나 ‘–옵션명’를 붙여서 값을 준다.

바로 예를 살펴보자.

가령 이런 경우가 있을 수 있다. ‘ls’를 써서 파일을 확인하되 숨김파일까지 전부 보고 싶다면?
아, 유닉스에서는 숨김파일은 파일 이름 앞에 .을 붙여서 지정한다. 그러면 일반 ‘ls’로는 그 파일이 경로에 존재해도 출력되지 않는다.

숨김파일까지 포함해서 목록을 보고 싶다면 ‘ls’에 ‘-a’ 인자를 주면 된다.

$ ls -a

> ...
.jssc            bin
.jupyter         data-science-pandas
.lesshst         gitrepo
.local           image
.mozilla         ipython-dir
.mysql_histor    shell-scripts
.nano            study_pl
...

여기서 ‘a’는 ‘all’의 약자로, 경로를 바꾸지 않았는데도 숨긴파일들이 모두 화면에 나왔다. 보통 보호해야 할 파일이나 설정파일 등이 숨김파일로 많이 지정된다.

위와 같이 자주 쓰이는 ‘ls’의 인자들은 다음과 같다.

-a : 숨김파일까지 포함해 디렉토리 안의 모든 파일이 출력된다.
-t : 목록을 출력할 때, 수정 시간 순으로 정렬해서 출력한다.
-l : 단순히 파일의 이름만 아니라 이들에 대한 자세한 정보를 출력한다.

이때 눈여겨 볼 것이 ‘-l’ 인자인데 ‘l’은 ‘long’의 약자로 ‘ls -l’을 실제로 실행해보면 파일의 이름뿐 아니라 파일과 관련한 수많은 정보가 같이 출력되는 것을 확인할 수 있다. 이 정보들도 가치 있는데, 나중에 추가적인 포스트에서 살펴보도록 한다.

그리고 옵션을 여기서는 3개만 소개했지만 실제로는 이것보다 훨씬 많다. 추가적인 공부가 필요하다.

또한 옵션을 두 개 이상 같이 쓰고 싶으면 붙여써주면 된다.

$ ls -alt

-rw-------   1 sunghwanpark sunghwanpark 418879 10월 11 23:44 .zsh_history
-rw-rw-r--   1 sunghwanpark sunghwanpark  39475 10월 11 23:37 .viminfo
-rw-------   1 sunghwanpark sunghwanpark 129138 10월 11 22:01 .ICEauthority

복잡해보이지만 한 열 한 열은 그렇게 까다롭지는 않다… 이건 나중에…


그리고 커맨드 옵션은 이 기능뿐만 아니라 수많은 다른 유닉스 커맨드에서 설정값을 줄 때 사용된다. 이번 포스트뿐만 아니라 다른 기능들을 소개할 때도 필수적인 옵션은 같이 설명하고자 한다.


3. cd

cd는 원하는 경로로 커서(working directory)를 이동한다. 이또한 쉘을 활용하면서 무수히 사용하게 될 것이다.

가령 내가 ‘/var’ 경로로 커서를 이동하고 싶다면 이렇게 사용하면 된다.

$ cd /var

입력된 경로가 실제 존재하는 경로이고 접근이 가능하다면 커서가 이동한다. 추가적인 옵션은 받지 않는다.

대신 이 커맨드를 사용할 때는 경로를 하드코딩하는 것보다도 가급적이면 유닉스에서 파일 시스템에 사용하는 명칭(alias)를 대신 사용하면 유용하다. 이 명칭들은 일종의 별명과 같아서 명칭을 입력하면 쉘이 실제 이름으로 확장한다. 이 확장은 쉘에서 중요한 개념으고, 향후 상세하게 다룰 예정이다.

이 명칭들을 활용하면 cd를 비롯한 쉘 커맨드 활용을 좀더 효율적으로 할 수 있는데 구체적인 활용을 하기 전에 명칭들의 예를 몇 가지 살펴보자.

경로 별칭 1: ~

~(tilde)라고 하는데 이것은 사용자의 홈 디렉토리를 의미한다. 유닉스의 파일시스템에서는 ‘사용자’만을 위해 할당된 공간은 ‘/home’ 디렉토리이고 이곳에 다수의 사용자들의 디렉토리가 각각 존재한다. 각 사용자는 자신의 홈디렉토리에 필요한 작업을 모두 하며 그 바깥은 시스템 관리자의 영역으로 손대지 않는 것이 좋다.

가령 내 홈 디렉토리는 ‘/home/sunghwanpark’으로 내가 작업하는 모든 내용물들이 이 안에 있다. 이는 당신도 마찬가지다.

자, 이제 내가 임의의 어떤 위치에 있다가 내 홈 디렉토리로 이동하고 싶다고 하자. 이때 ‘cd /home/sunghwanpark’는 이 커맨드의 중요성에 비해 너무나 길고 무겁다. 대신,

$ cd ~
$ pwd

-> /home/sunghwanpark

이와 같이 손쉽게 홈 디렉토리에 접근할 수 있다.

경로 별칭 2: .

.은 내가 위치한 현재 경로를 가리킨다. 경로에는 절대경로와 상대경로라는 것이 있는데 이 .은 상대경로의 출발점으로 내가 속한 현재 경로를 가리키게 된다.

$ cd .

현재 위치에서 현재 위치로 경로를 수정했다… 음.. 이건 아무런 쓸모도 없어보인다. 대신, 이런 활용을 해볼 수 있다.
내 현재 경로에 있는 ‘movie’라는 디렉토리에 이동하고 싶을 때 다음 두 식은 완전히 똑같다.


$ cd movie
$ cd ./movie

둘 다 현재 경로에 있는 ‘movie’ 라는 디렉토리로 이동한다. 대신 두 번째 식은 확실히 ‘내가 위치한 디렉토리에 있는 movie’를 명시적으로 표현해서 경우에 따라 가독성을 높일 수 있다.

이 현재 경로를 뜻하는 .은 cd 보다는 다른 커맨드에서 더 빛을 발한다.(그래서 중요하다.)

경로 별칭 3: ..

..은 현재 디렉토리의 상위 디렉토리(parent directory)를 의미한다. 가령 내가 현재 속한 경로가 ‘/home/sunghwanpark’라면 ..로 cd를 사용하면 다음과 같이 이동한다.

$ pwd
$ cd ..
$ pwd

-> /home/sunghwanpark
-> /home

우리가 윈도우즈에서 폴더를 이동하다가 ‘뒤로 가기’ 버튼을 누르는 것과 같은 동작을 취한다.


말했듯이 이 명칭들은 cd에서만 쓰이는 것이 아니고, 유닉스에서 경로를 표현해야 할 때마다 쓰일 수 있기 때문에 중요하다. 특히 이 3개는 반드시 기억하고 필요할 때는 사용하는 것을 추천한다.

CRUD 커맨드


CRUD란?

CRUD는 Create, Read(or Retrieve), Update, Delete, 이렇게 4 단어의 약자로 UI의 관점에서는 사용자가 데이터를 처리하는 가장 기본적인 4가지 기능을 뜻한다. 사용자는 데이터를 이리 볶고, 저리 볶고 할 수 있지만 사용자의 모든 작업은 데이터를 생성하고, 읽고(출력하고), 수정하고, 삭제하는 이 4가지 기능 가운데 속한다.

우리가 윈도우 운영체제를 쓸 때도 마찬가지이다. 난 윈도우에서 폴더를 열고(Read), 엑셀 파일을 하나 만든 뒤(Create), 파일 안에 데이터를 입력하고(Update), 필요 없어지면 가차없이 휴지통으로 보낼 수 있다.(Delete) 파일이나 폴더는 비트의 집합으로 곧 데이터다. 우리는 우리가 하는 모든 컴퓨터 생활에서 CRUD를 사용하고 있다.


예상했겠지만 CRUD는 리눅스 인터페이스에서도 핵심이다! 우리는 파일을 만들고 읽고 수정하며 지운다. 이번에는 리눅스에서 CRUD에 핵심적인 기능들을 알아보겠다. 이 내용들도 너무나 중요해서 쉘을 쓴다고 하면 몰라서는 안 된다.


4. mkdir(touch)

mkdir는 ‘make directory’의 약자로 디렉토리를 만든다. 윈도우즈의 ‘새 폴더’와 정확히 같은 기능을 한다.

$ mkdir ./new-directory
$ ls

-> new-directory old-directory old-school
...

mkdir가 받는 옵션 인자 중 내가 좋아하는 것은 이것이다.

-p : parent directory가 존재하지 않으면 같이 만든다.

이 인자의 뜻은 무엇일까? 가령 내가 현재 위치에서 ‘a’라는 디렉토리를 만들고 그 안에 ‘b’라는 디렉토리를 만들고 싶다고 하자. 그럴 때 위와 같이 입력하면 문제가 발생한다.

$ mkdir ./a/b

mkdir: `./a/b' 디렉토리를 만들 수 없습니다: 그런 파일이나 디렉터리가 없습니다

없으니까 만들려고 하는데 이게 뭔소린가?? 이 오류 메시지의 뜻은 ‘b’라는 디렉토리를 만들려는데 ‘a’가 없어서 못 만들겠다는 뜻이다. 그러면 한 번에 ‘a’도 만들고 ‘b’도 만들면 될 것이고 -p는 그 일을 한다.

$ mkdir -p ./a/b


‘디렉토리를 만드는 기능이 있으면 파일을 만드는 기능도 있어야 하지 않느냐?’고 묻는다면 생각을 하고 사는 것이다. 맞다. 그런데 ‘mkdir’와 달리 함수를 만드는 용도만을 위한 기능은 없다. 대신 파일을 만들 수 있는 다양한 방법이 있는데 그중 가장 쉬운 것만 소개하겠다.

$ ls

-> a b c

$ touch ok
$ ls

-> a b c ok

‘touch’라는 기능을 사용해 ‘ok’라는 빈 파일을 만들었다. 원래 이 ‘touch’는 파일의 접근, 최근 수정 날짜를 최신으로 업데이트하는 함수이다. 모든 파일에는 파일명 이외에도 일반적으로 드러나지는 않지만 파일과 관련된 메타데이터들이 많이 존재하는데 그중 하나가 최근 수정 날짜다. 이 변수는 ‘이 파일보다 예전에 사용한 파일들은 삭제해라’, ‘파일들을 사용한 최신순으로 정렬해라’ 등과 같은 연산에 요긴히 쓰일 수 있다. 근데 이 ‘touch’의 특징은 만약 인자로 받은 파일이나 폴더가 존재하지 않으면 같은 이름의 빈 파일을 하나 만든다. 그래서 예제에서는 이 특성을 사용해 빈 파일을 만든 것이다.

사실 빈 디렉토리를 만들 일은 있는데 빈 파일을 만들 일은 없다. 빈 디렉토리를 만들 이유는 파일을 담는다는 뚜렷한 목적이 있는데 반해 빈 파일을 만드는 이유는 딱히 없기 때문이다. 단순히 참고용으로만 적었다.

5. echo

echo는 받은 인자들을 화면으로 출력하는 기능이다.

$ echo "I'm back!"

-> I'm back!

이것만 보면 뭐하는건가 싶다. echo를 이렇게만 쓰면 무기력하고 다시 쓸 일 없는 기능처럼 보이는데 사실 echo는 아직 설명하지 못한 쉘의 다양한 기능과 조합할 때 매우 강력해지는 기능이다. 하나만 예를 들어보자.
앞서 쉘에서도 우리가 일반적인 프로그래밍에서 하는 기능들을 모두 가능하다고 했다. 그중에는 변수 할당도 있을 것이다. 가령 내가 ‘a’라는 변수에 3을 할당하고 그 값을 확인하고 싶다고 하자. 이때 echo를 써볼 수 있다.

a=3
echo $a

-> 3

유닉스에서는 변수 할당 시 일반적인 대입 연산자(=)를 쓰되, 양 피연산자 사이에 공백이 있으면 안 된다. 그것도 이유가 있는데 일단 넘어가겠다. 그리고 그 값을 확인할 때 a가 문자 리터럴 ‘a’가 아닌 변수명 a를 나타내기 위해서는 유닉스에서는 변수명 앞에 ‘$’를 붙여줘야 한다. echo $a와 같은 식을 통해 변수 a의 값을 확인할 수 있었다.

이것말고도 echo의 활용은 다른 기능과 조합하면 쓸모 있어진다. 이것들은 향후 반드시 다루도록 하겠다.


6. cat

cat은 하나 이상의 파일 이름을 입력으로 받아 화면에 그 내용들을 출력하는 기능이다. 정말 정통적인 Read 기능이라고 할 수 있겠다.

$ cat README.md

-> Parkito's on the way
...

이 기능은 매우 단순한데 간단하게 파일의 내용을 확인하고 싶다든지 할 때 유용하다. 왜 이 기능이 이름이 고양이(cat)일지 궁금하지?? 궁금했을거야. 사실 ‘cat’은 고양이가 아니라 ‘concatenate’의 약자로 뜻은 ‘사슬같이 잇다’, ‘연결시키다’라고 한다. cat은 2개 이상의 파일 이름을 같이 입력하면 파일들을 모두 읽어 한 번에 출력한다. 이런 활용은 파일의 내용을 확인할 때보다는 다수의 파일을 하나의 파일로 묶는다든지 하는 기능을 수행할 때 유용하다. 향후 표준 입출력과 관련한 포스트 이후에 서술하도록 하겠다.

이 기능에도 몇 가지 옵션이 있다.

-s : 줄 사이에 빈 칸이 반복되면 이를 한 줄로 줄인다.
-n : 줄에 IDE처럼 숫자를 부여한다.

7. cp

cp는 ‘copy’의 약자로 파일이나 디렉토리를 복사한다. 윈도우즈의 파일이나 폴더에도 같은 기능을 할 수 있기 때문에 아마 익숙할 것이다. cp에는 다음과 같이 인자를 순서대로 넣어줘야 한다.

$ cp [옵션] 복사할대상(src) 복사된대상(dest)

이 기능에는 srcdest 를 꼭 붙여주어야 한다.(옵션은 당연히 선택적으로 함수나 기능의 사용설명서에 ‘[]’ 안에 있는 것들은 선택적이라는 뜻이다.) 가령 내가 /home/sunghwanpark/a/b/c/d/e라는 파일을 단순히 홈 디렉토리로 복사하고 싶으면 다음과 같이 입력하면 된다.

$ cp ~/a/b/c/d/e ~

아까 설명한 ~를 잘 활용했다. 이렇게 입력하면 파일을 복사해 홈 디렉토리에 둠으로써 2개 존재하게 되었다.

조심할 것은 ‘cp’는 dest 에서 기존의 파일의 존재 여부를 확인하지 않기 때문에 기존의 파일을 덮어쓸 수 있다. 유의하기 바란다.


8. mv

mv는 ‘move’의 약자로 파일이나 폴더를 다른 곳으로 이동시킨다. 윈도우즈 운영체제에서 마우스로 폴더를 끌어 옮기거나 ‘잘라내기’ 후 ‘붙여넣기’ 할 때와 유사하다. 인자는 ‘cp’ 때와 같다.

$ mv [옵션] 복사할대상(src) 복사된대상(dest)

cp와 비슷하지만 결정적인 차이가 있다. cp는 ‘복사’기 때문에 실행 후에 파일이 srcdest 두 군데 존재하게 되고, ‘mv’는 ‘이동’이기 때문에 실행 후 파일이 dest 에만 있으며 src 에는 없다. 아까의 예제에서 mv ~/a/b/c/d/e/ ~라고 입력하면 ‘e’ 파일은 원 위치인 ‘~/a/b/c/d’에는 없고 ‘~’에만 있게 될 것이다.


mv는 또한 파일이나 디렉토리의 이름을 바꿀 때 사용한다. 윈도우즈에는 파일을 오른쪽 버튼으로 클릭하면 ‘이름 바꾸기’가 있지만 유닉스에는 ‘이름을 바꾸는 것만을 위한’ 기능은 없는데 ‘mv’를 사용하면 가능하다.

가령 내가 현재 폴더의 ‘v1.txt’를 ‘v2.txt’로 이름을 바꾸고 싶다고 하자. src 가 사라진다는 ‘mv’의 특성을 활용하면 이름을 바꿀 수 있다.

$ mv ./v1.txt ./v2.txt

9. rm

rm는 ‘remove’, 즉 ‘지우다’의 약자로 파일이나 디렉토리를 삭제한다. 인자로 삭제할 파일이나 디렉토리의 이름을 주면 된다.

‘cp’나 ‘mv’에서도 그렇지만 유닉스에서는 기존 파일을 덮어씌우거나 할 때 경고를 주지 않고 바로 실행한다. 이것은 유닉스의 “We all agree we’re grown-ups” 정신 때문인데, 내가 입력한 코드에 대해서는 내가 책임지겠다는 것이다. 그런데 ‘rm’는 ‘cp’나 ‘mv’와 달리 특히 더 조심해서 써야 한다. 지우는 것은 절대 되돌릴 수 없기 때문이다. 그래서 ‘rm’을 입력하기 전에는 인자명을 정확히 확인하고 사용하는 것이 중요하다.

‘rm’는 꼭 써야할 수도 있는 중요한 옵션이 있는데 다음과 같다.

-r : 'recursive'의 약자로, 디렉토리를 삭제할 때 그 안의 있는 파일이나 디렉토리까지 재귀적으로 모두 삭제할 것을 지정함.
-f : 'force'의 약자. 지우는 것은 신중해야 하기 때문에 사용자가 파일이 많은 디렉토리를 삭제할 때는 실수로 중요한 파일을 지울 수도 있음. 따라서 'rm'는 디렉토리 안의 파일마다 삭제할 것인지 yes/no 로 묻는데 이 옵션을 쓰면 묻지 않고 강제로 전부 삭제함.

디렉토리를 삭제할 때는 -rf 옵션을 꼭 같이 써줘야 한다. 그렇지 않으면 삭제 실행이 안 된다.

가끔 생활코딩에 정신나간 놈들이 ‘님들 개꿀임 ㅋㅋ 커맨드에 rm -rf / 해보셈 ㅋㅋㅋ’하는데 이 코드는 절대 실행해서는 안 되는 코드다.

위 코드는 루트 디렉토리(‘/’)를 삭제하라는 의미로 전통적인 유닉스는 그 중요성을 고려하지 않고 정말로 입력받은 대로 삭제한다. 이는 치명적으로 절대 실행해서는 안 되는 코드이다. 장난으로라도 저런 것을 올렸다가 입문자들이 한 명이라도 실행해보면 어쩌려고 저러는지… 사실 현대적인 리눅스 배포판들에서는 저런 치명적인 경로를 삭제하는 코드는 실행하지 않도록 되어 있기는 하다.


마치며


이상으로 유닉스 쉘에 핵심적인 커맨드 9개를 살펴보았다. 이 9개는 유닉스를 사용할 때 정말 필수적인 커맨드로 이들 없이는 정상적인 컴퓨터 생활을 하기 힘들다. 그렇기 때문에 이 9개는 꼭 여러 번 써보고 체득할 것을 권장한다.

또한 난 이 기능들에 대해 다 설명하지도 않았다. 이들은 확인해보면 내가 제시한 것보다 더 많은 옵션과 활용방법을 가지고 있는데 그중 중요한 것과 내가 아는 것의 교집합만 추려서 설명했다. 하지만 가능한 다른 옵션들이나 활용법을 알면 손해볼 것은 없다. 그만큼 자주 쓰기 때문이다.

내가 프로그래밍 언어나 쉘 커맨드를 공부할 때 항상 추천하는 방법은 헬핑(helping)을 생활화하는 것이다. 헬핑은 내가 만든 단어인데 CLI 환경에서 명령어와 함께 --help를 같이 입력해보는 것이다. 전부는 아니지만 대다수의 경우 해당 기능의 사용서가 출력된다. 이 기능들은 사실 누가 만든 ‘프로그램’이고 이런 프로그램들은 다른 사람들을 위한 ‘사용설명서’를 가지고 있다. 그래야 사람들이 잘 쓸 것 아닌가? 나도 이 포스트를 적을 때 위 커맨드마다 헬핑 해보고 다시 한 번 확인했다. 내가 처음 보는 함수나 기능을 만난다면 먼저 헬핑을 하자. 이것이 습관이 되어야 한다. 인터넷 검색은 다음이다.

쉘의 세계는 정말로 방대한 세계이다. 이 포스트는 그 첫 발걸음을 떼는 시작이라고 할 수 있다. 앞으로 나도 더 공부할건데 더 공부해서 쉘 스크립트로 자동화까지 해보는 경지에 이르러보자. 아마 될 것 같다.