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까지를 의미함

through.kim's profile image

through.kim

2016-12-23 09:55

Read more posts by this author