UNIX의 가장 좋은 특징 중의 하나는 쉘의 명령행(Command Line)이다 요즘의 모든 운영체제들은 명령행을 가지고 있다. 그렇다면 무엇이 Unix를 특별하게 만드는 걸까?
Unix 쉘 명령행은 많은 단축값(shorcut)을 제공한다. 이들 중 어떤 것들은 다른 운영체제에서 발견할 수도 있지만 그렇지 않을 수도 있다. 이 장에서는 이러한 많은 단축값들에 대해서 알아본다.
라인 삭제 및 단어 삭제를 사용해 빠르게 라인 수정하기
일반적인 유저는 백스페이스나 DEL키를 연타해 오타가 있는 명령행을 지운다. 하지만 단축키를 몇 개 외워두면 훨씬 간단히 작업할 수 있을 것이다.
- 라인 삭제시 CTRL+u 또는 CTRL+x
- 단어 삭제시 CTRL+w
- ALT+backspace 입력한 명령줄 단어 단위로 삭제
- 전라인 삭제는 CTRL+a
명령행 다시 출력하기
- CTRL+r을 누르면 타이핑 했던 것들이 다시 출력된다. (요즘은 방향키로 되는 것 같다.)
- CTRL+r이후에 찾고자 하는 문자를 적고 검색
와일드카드를 사용하여 파일 생성하기
쉘의 [] 와일드 카드는 파일들의 범위와 매칭된다. 예를들어 afile, bfile, cfile, dfile이라는 파일이 있다면 다음과 같이 입력하여 처음 3개의 파일을 출력할 수 있다.
$ ls
afile bfile cfile dfile
$ cat[a-c]file
this is afile
this is bfile
this is cfile
그러나 [e-f]file을 생성하려고 시도하면 되지 않는다. 와일드카드는 아직 존재하지 않는 파일에 대해서는 일치하지 않기 때문이다.
$ touch [e-f]file
$ ls
[e-f]file afile bfile cfile dfile
{}를 사용하여 문자열 생성하기
$ touch {e,f}file
$ ls
afile bfile cfile dfile efile ffile # {}안에 있는 각각의 텍스트에 대해 명령을 수행한다.
$ echo {g,h}file
$ touch gfile hfile # echo명령어를 통해 명령행이 인식하는 것을 볼 수 있다.
문자열 편집(콜론) 연산자
# !$는 마지막 인자를 반환한다.
# :h는 파일명을 떼어내고 헤더만 남긴다.
$ echo /var/log/nginx/error.log
/var/log/nginx/error.log
$ echo !$:h
/var/log/nginx
# :t 연산자는 경로면의 뒷부분을 반환한다.
$ echo /var/log/nginx/error.log
/var/log/nginx/error.log
$ echo !$:t
error.log
# :r은 파일명의 확장자를 제외하고 반환한다.
$ echo test.py
test.py
$ echo !$:r
test
# :e 연산자는 파일의 확장자를 반환한다.
$ echo test.py
test.py
$ echo !$:e
.py
파일명 입력대행
TAB키를 눌러 시행가능하다. TAB을 두번 누르면 일치하는 모든 파일을 출력한다.(tcsh와 csh는 CTRL+d)
자동완성을 할때 .o 와 .out 확장자를 무시하고 싶다면 아래와 같이 입력하면 된다.
$ set fignore=(.o .out) #tcsh 과 csh
$ FIGNORE= '.o:.out' #bash
순환문을 사용하여 명령어 반복하기
$ ls
afile bfile cfile dfile efile ffile
# tcsh csh
$ foreach file (afile bfile cfile)
>cat $file
>end
this is afile
this is bfile
this is cfile
# bash
$ for file in afile bfile cfile
> do
> cat $file
> done
this is afile
this is bfile
this is cfile
일회용 스크립트로 복잡한 명령어 입력하기
$ soelim a.ms b.ms | pic | eqn | tbl | triff -ms -a -rzl | more
만약에 위와 같이 긴 명령어를 입력해야 한다면 텍스트 편집기를 사용해 작성해주는 편이 편리할 것이다.
$ vi long_cmd
# 일회용 스크립트
soelim a.ms b.ms | pic | eqn | tbl | triff -ms -a -rzl | more
ESC :wq
$ sh long_cmd
명령어를 작성하고 sh명령어를 통해 파일을 실행시키면 명령행에 입력한 것과 같은 효과를 나타낸다. 만약에 지속적으로 사용할 필요가 있는 명령어라면 파일에 적절한 이름을 붙여주고 개인 bin 디렉토리에 저장해주면 언제든지 불러와 사용할 수 있을 것이다.
명령어 치환
역인용부호(`)는 명령어 치환 역할을 한다.
$ ls
afile bfile cfile dfile
$ cat [a-d]file
this is afile
this is bfile
this is cffassdasd
this is dfssssss
$ grep -l file ./* # 현재 폴더의 모든 파일 중에 file이라는 문자를 가진 파일명만 출력
./afile
./bfile
$ vi `grep -l file ./*` #grep의 결과값을 명령어로 치환
#2개 파일 편집
프로세스 치환
comm 명령어는 두개의 파일을 비교하는 명령어이다. 제대로 비교를 하려면 sort명령어로 파일을 정렬해주어야 한다.
$ cat efile
a
ab
abc
wdd
ssd
bbc
ll
ls
ps
$ cat ffile
a
abc
ss
ssd
ls
ps
qq
dd
$ sort efile > efile.sort
$ sort ffile >ffile.sort
$ comm efile.sort ffile.sort
세 줄에 이르는 명령어를 bash의 <(프로세스)연산자를 이용해 한 줄로 바꿀 수 있다.
$ comm <(sort efile) <(sort ffile)
a
ab
abc
bbc
dd
ll
ls
ps
qq
ss
ssd
wdd
# 첫번째 탭은 efile 두번째는 ffile 세번째는 공통부분
프로세스 연산자는 프로세스를 수행하고 그 결과를 이름 파이프(named pipe)에 출력한다. 그리고 그 이름 파이프의 파일명은 명령행의 인자가 된다. 다시말해 한명령어의 결과를 다른 명령어에 전달한다는 것
! 스크립트를 사용할 수도 있다. ! 스크립트는 명령행의 출력결과를 임시파일에 저장하고 또 그 임시파일명을 표준 출력으로 출력한다. 대부분의 Unix프로그램은 인자로 파일명을 받기 때문에 ! 스크립트를 사용하는 일이 많다.
$ comm `! sort efile` `! sort ffile` #안된다...
반복 실행하기
$ for i in {1..4}
> do
> echo hello world
> done
hello world
hello world
hello world
hello world
{1..4}는 1~4까지를 의미함