2011. 8. 7. 03:05

리다이렉션(Redirection)

♧ 명령이 실행되기에 앞서 쉘에 의해 특별하게 해석되는 표시를 사용하여

입력과 출력을 방향 전환 또는 리다이렉트 할 수 있다.

 

stdin

키보드 (표준입력, 0)

stdout

모니터 (표준출력, 1)

stderr

모니터 (에러출력, 2)

>

출력 리다이렉션 (stdout 만을 보냄)

<

입력 리다이렉션 (stdin 파일로부터 데이터를 받음)

>>

추가 출력 리다이렉션 (새로 덮어쓰지 않고 추가)

2>

표준에러 리다이렉션 (stderr 만을 보냄)

&>word

>& word

>word 2>&1

표준 출력과 표준에러를 동시에 리다이렉트 함

 

▷ 표준출력은 파일 output.txt로 리다이렉트

$ ls /tmp /tmmp > output.txt

ls: /tmmp에 접근할 수 없습니다.: 그런 파일이나 디렉터리가 없습니다

 

▷반대로 표준에러를 error.txt 파일에 리다이렉트.(표준출력은 그대로 화면 출력)

$ ls /tmp /tmmp 2> errors.txt

/tmp:

keyring-QC9vEx pulse-2L9K88eMlGn7 rsync_1007

orbit-devanix pulse-PKdhtXMmr18n ssh-jbzyRBjE1162

 

▷ 앞의 두 예제를 합쳐놓은 것.

$ ls /tmp /tmmp 2> errors.txt > output.txt

/* cat으로 errors.txt 와 output.txt 출력 */

$ cat errors.txt

ls: /tmmp에 접근할 수 없습니다.: 그런 파일이나 디렉터리가 없습니다

$ cat output.txt

/tmp:

keyring-QC9vEx

orbit-devanix

pulse-2L9K88eMlGn7

pulse-PKdhtXMmr18n

rsync_1007

ssh-jbzyRBjE1162

 

▷ 두 스트림(stdout, stderr) 출력을 모두 everything.txt 파일에 쓰도록 함.

$ ls /tmp /tmmp > everything.txt 2>&1

/* cat으로 everything.txt 출력 */

$ cat everything.txt

ls: /tmmp에 접근할 수 없습니다.: 그런 파일이나 디렉터리가 없습니다

/tmp:

keyring-QC9vEx

orbit-devanix

pulse-2L9K88eMlGn7

pulse-PKdhtXMmr18n

rsync_1007

ssh-jbzyRBjE1162

 

▷ 두 개의 그레이터 댄(>>) : 새로 덮어쓰지 않고 추가 되도록 하기

$ ls /tmp >> output.txt

 

▷ 에러 출력을 화면에 출력 하지 않기 (비트버킷 파일(/dev/null) 보내기)

$ ls /tmp /tmmp 2> /dev/null

/tmp:

keyring-QC9vEx pulse-2L9K88eMlGn7 rsync_1007

orbit-devanix pulse-PKdhtXMmr18n ssh-jbzyRBjE1162

 

/etc/hosts 파일을 mail 명령어의 표준 입력 스트림으로 보내기

$ mail chris < /etc/hosts

 

 

■ 파이프( | )를 사용

♧ 하나의 프로세스 출력을 파일이 아닌 다른 프로세스로 리다이렉트.

 

▷ ls명령의 표준출력이 파이프를 통해 sort 명령어로 보내져 실행결과가 정렬되어 출력.

$ ls /tmp | sort

▷ 파이프 리다이렉션을 조합하여 ls 명령어의 표준출력은 정렬되고 에러출력은 비트버킷(/dev/null)으로 비운다.

$ ls /tmp /tmmp 2> /dev/null | sort

▷ 그밖에 다양한 활용.

/* 설치되어 있는 모든 패키지 에서 sql 문자열이 포함되어 있는 패키지 개수 */

$ dpkg-query -l | grep -i sql | wc -l

/* Firefox 문자를 포함하고 있는 프로세스 출력 */

$ ps auwx | grep firefox

/* 프로세스 목록 한 화면씩 출력 */

$ ps auwx | less

/* 순수하게 맨 페이지 경로만을 출력 */

$ whereis -m bash | awk '{print $2}'

 

 

■ 작은 인용부호( ` )를 사용

♧ 인용부호로 묶인 명령어의 실행결과를 나머지 명령어의 입력으로 사용

/* ps 명령어의 전체경로를 찾은 후에 이 명령어를 포함하고 있는 패키지를 찾음 */

$ dpkg-query -S `which ps` → dpkg-query -S /bin/ps

/* bash 명령어의 전체경로를 찾아 해당 명령어의 상세 목록을 보여줌 */

$ ls -l `which bash` → ls -l /bin/bash

☞ 작은 인용부호( ` )는 키보드 느낌표(!) 왼쪽에 있음.

 

 

■ xargs명령을 이용

♧ 하나의 명령의 실행결과를 다른 명령어의 인자로 넘겨주기

 

▷ ls명령의 /bin/b*의 실행결과는 dpkg-qeury -S 명령어의 인자로 전달

$ ls /bin/b* | xargs -t dpkg-query -S

dpkg-query -S /bin/bash /bin/bunzip2 /bin/busybox /bin/bzcat /bin/bzcmp /bin/bzdiff /bin/bzegrep /bin/bzexe /bin/bzfgrep /bin/bzgrep /bin/bzip2 /bin/bzip2recover /bin/bzless /bin/bzmore

bash: /bin/bash

bzip2: /bin/bunzip2

busybox-static: /bin/busybox

bzip2: /bin/bzcat

bzip2: /bin/bzcmp

bzip2: /bin/bzdiff

bzip2: /bin/bzegrep

bzip2: /bin/bzexe

bzip2: /bin/bzfgrep

bzip2: /bin/bzgrep

bzip2: /bin/bzip2

bzip2: /bin/bzip2recover

bzip2: /bin/bzless

bzip2: /bin/bzmore

-t 옵션을 적용하면 명령어 실행시 화면에 좀 더 상세한 정보가 출력.

 

▷ -I{}를 이용하여 ls명령이 출력하는 각 문자열을 하나씩 dpkg-query 명령어의 입력으로 보냄.

$ ls /bin/b* | xargs -t -I{} dpkg-query -S {}

dpkg-query -S /bin/bash

bash: /bin/bash

dpkg-query -S /bin/bunzip2

bzip2: /bin/bunzip2

dpkg-query -S /bin/busybox

busybox-static: /bin/busybox

dpkg-query -S /bin/bzcat

…[중략]…

☞ 실행결과에서 볼 수 있듯이 dpkg-query -S 명령어는

ls로부터 인자로 전달된 각 개별 문자열을 사용해 반복적으로 실행.

 

 

※ 맨 페이지(man page) 참조 : man bash, man xargs

Posted by devanix