본문 바로가기
오픈소스SW

리눅스 명령어 기초 4 - bash 명령어, bash redirection, pipe

by sepang 2021. 9. 2.

 들어가기 전

명령어를 입력하면 해당 명령어를 실행시키기 위해서는 명령어 인터프리터(interpeter), 즉 이 필요하다. 우리가 사용하는 셸은 'bash'라고 한다. 이전에도 설명했다시피 터미널이 기계에 접속되면 셸 프로그램이 실행된다. 이후에 프롬프트 창을 띄우는데 앞에서도 지겹게 봤던 검은 창이다.

표준 입출력

하드웨어 시스템

 지금까지 우리는 당연하듯이 키보드로 명령어를 입력하고 해당 결과를 프롬프트 창으로 확인했다. 이렇듯 기본적으로 사용되는 입출력 device를 standard input/output이라고 한다. 즉 셸에서는 표준 입력인 키보드 입력으로 명령을 받아서 이를 처리한 후에 표준 출력인 프롬프트 창으로 결과를 출력하는 것이다.

history

   .
   .
   .
   84  (sleep 500; echo "1st job")
   85  (sleep 500; echo "1st job")&
   86  jobs
   87  ps
   88  kill 8407
   89  (sleep 500; echo "1st job")&
   90  ps
   91  kill 8414
   92  clear
   93  history

입력했던 명령어 기록을 보여준다. 

추가적으로 '!!'를 입력하면 가장 최근에 입력했던 명령어를 실행한다. 그리고 history를 보면 명령별로 옆에 번호가 달려있는데  '!(번호)'를 입력하면 해당 번호의 명령을 실행한다. 또 '!(명령어)'를 입력하면 가장 최근에 입력했던 (명령어)를 실행한다. 위 사진 기준으로 '!kill'을 입력하면 이는 'kill 8414'와 동일하다(물론 해당 프로세스는 이미 죽었다).

alias (별칭)=(명령어)

sepang@ubuntu:~$ alias p1=pwd
sepang@ubuntu:~$ p1
/home/sepang

자주 사용하는 명령어에 별칭을 붙여줄 수 있다. 위에서는 pwd 명령어에 p1이라는 별칭을 붙여줬다. 이후에는 p1을 입력하면 pwd와 동일한 명령을 수행한다. 당연하지만 별칭을 이미 존재하는 명령어로 해버리면 그 명령어는 사용할 수 없게된다. 혹시라도 그렇게 했다면 'unalias (별칭)'을 해주면 별칭 사용을 취소할 수 있다.

redirection

>, >>

sepang@ubuntu:~$ pwd > pwdout
sepang@ubuntu:~$ ls
Desktop  Documents  Music     Public  snap       Videos
dir1     Downloads  Pictures  pwdout  Templates
sepang@ubuntu:~$ cat pwdout
/home/sepang
sepang@ubuntu:~$ date >> pwdout
sepang@ubuntu:~$ cat pwdout
/home/sepang
Thu 02 Sep 2021 01:40:08 AM PDT
sepang@ubuntu:~$ date > pwdout
sepang@ubuntu:~$ cat pwdout
Thu 02 Sep 2021 01:40:25 AM PDT

그냥 pwd 명령어를 입력하면 표준 출력인 프롬프트 창에 결과인 현재 디렉토리 위치를 출력한다. 그런데 명령어 뒤에 '>'를 붙이고 뒤에 이름을 붙여주면 해당 이름을 가진 파일이 생성되고 이 안에 명령어의 결과가 담긴다. 즉 입력에 대한 결과가 표준 출력이 아닌 파일로 출력된 것이다. 그럼 '>>'를 사용하면 어떻게 될까 결과를 파일에 출력할 때 원래 내용에 이어서 출력한다. 대조적으로 '>'를 사용하면 원래 파일내용을 모두 지우고 결과를 출력하는 것을 확인할 수 있다.

<

sepang@ubuntu:~$ cat < pwdout
Thu 02 Sep 2021 01:40:25 AM PDT

 '>'이 출력방향을 바꾸는 것이었다면, '<'는 입력방향을 바꾼다. 즉 표준 입력인 키보드 입력을 받지 않고- 파일의 내용을 입력으로 받는 것이다. cat 명령어같은 경우에는 'cat (파일명)'과 결과가 동일하다.

sepang@ubuntu:~$ cat < pwdout > pwdout2
sepang@ubuntu:~$ cat pwdout2
Thu 02 Sep 2021 01:40:25 AM PDT

이해를 위해 <, >를 섞어보자. 위 명령어는 어떻게 해석할 수 있을까? 순서대로 보면 pwdout 파일의 내용을 입력으로 받아서 그 결과 값을 pwdout2라는 파일로 출력시킨다.

 diff (파일명) (파일명)

sepang@ubuntu:~$ diff pwdout pwdout2
sepang@ubuntu:~$ date >> pwdout2
sepang@ubuntu:~$ !diff
diff pwdout pwdout2
1a2
> Thu 02 Sep 2021 01:54:16 AM PDT

 두 파일에서 내용이 다른 부분을 출력한다. 처음에는 pwdout, pwdout2의 내용이 동일하여 아무것도 출력하지 않았지만 pwdout2에 date 결과를 덧붙이고 다시 diff를 해주니 두 파일의 차이점을 출력한다.

|

sepang@ubuntu:~$ ls | grep pwdout
pwdout
pwdout2

redirection은 입력이나 출력을 파일로 사용했다면 파이프(pipe)는 프로세스로 사용하는 것이다. 특수기호 '|'를 사용하는데 '|'기준으로 왼쪽에 있는 명령어의 표준 출력을 오른쪽에 있는 명령어의 표준 입력으로 사용한다.  예를 들어서 확인해보자. 'ls'명령어의 출력값을 'grep'명령어의 입력으로 사용한다. grep의 인자인 'pwdout'이라는 문자열을 가진 폴더나 파일이 현재 디렉토리에 존재한다면 이들을 출력한다.

댓글