■ 리다이렉션(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
'컴퓨터 서적 정리 > Ubuntu Linux Toolbox' 카테고리의 다른 글
[Chap4 #04] - 파일 복사하기(cp, dd) (0) | 2011.08.07 |
---|---|
[Chap4 #03] - 파일시스템 살펴보기 (cd, pwd, pushd, popd) (0) | 2011.08.07 |
[Chap3 #02] - 리눅스 쉘 사용(2) (watch, tail) (0) | 2011.08.06 |
[Chap3 #02] - 리눅스 쉘 사용(1) (쉘 사용자 환경, history, alias) (0) | 2011.08.06 |
[Chap3 #01] - 리눅스 가상 콘솔(터미널) 사용 (0) | 2011.08.06 |