리디렉션에 대한 몇 가지 요령
이것에 대한 일부 구문 특수성은 중요한 동작을 가질 수 있습니다. 리디렉션에 대한 몇 가지 작은 샘플이 STDERR
, STDOUT
그리고 인수 순서 .
1-덮어 쓰기 또는 추가?
기호 >
의미 리디렉션 .
>
전체 완성 된 파일로 전송 , 대상이있는 경우 덮어 쓰기 를 의미 합니다 ( 나중에 # 3의noclobber
bash 기능 참조 ).
>>
존재하는 경우 대상 에 추가하는 것 외에도 보내기를 의미 합니다.
어쨌든 파일이 없으면 작성됩니다.
2- 쉘 명령 행 은 순서에 따라 다릅니다 !!
이를 테스트하기 위해 두 가지 출력 모두에 무언가를 보내는 간단한 명령이 필요 합니다 .
$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
( /tnt
물론; 이라는 이름의 디렉토리가 없을 것으로 예상합니다 .) 글쎄, 우리는 그것을 가지고있다 !!
자, 보자 :
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1
$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory
마지막 명령 줄 STDERR
은 콘솔에 덤프 되며 예상되는 동작이 아닌 것 같습니다 ... 그러나 ...
한 출력, 다른 출력 또는 둘 다에 대해 일부 포스트 필터링 을 수행하려는 경우 :
$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'
$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
이 문단의 마지막 명령 행은 이전 문단과 똑같습니다. 여기에서 필자 가 예상 한 동작이 아닌 것 같습니다 (따라서 이것은 예상 된 동작 일 수도 있습니다).
글쎄, 두 출력에서 다른 작업 을 수행 하기 위해 리디렉션에 대한 약간의 트릭이 있습니다
.
$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2 2>&1 | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan 7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory
참고 : &9
디스크립터는로 인해 자연스럽게 발생합니다 ) 9>&2
.
부록 : nota! 새로운 버전으로세게 때리다( >4.0
) 이런 종류의 작업을 수행하기위한 새로운 기능과 더 섹시한 구문이 있습니다.
$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory
마지막으로 이러한 계단식 출력 형식의 경우 :
$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
1 O: drwxrwxrwt 118 root root 196608 Jan 7 12:29 /tmp
2 E: ls: cannot access /tnt: No such file or directory
부록 : nota! 두 가지 방식으로 동일한 새 구문 :
$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
1 O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
2 E: ls: cannot access /tnt: No such file or directory
경우 STDOUT
, 특정 필터를 통해 이동 STDERR
다른 그리고 마지막으로 모두 출력은 세 번째 명령 필터를 통해 이동을 합병했다.
3- noclobber
옵션과 >|
구문 에 관한 단어
덮어 쓰기 에 관한 것입니다 .
set -o noclobber
bash가 기존 파일을 덮어 쓰지 않도록 지시 하지만 >|
구문을 사용하면 다음 과 같은 제한 사항을 통과 할 수 있습니다.
$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:15 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:19 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:21 CET 2013
매번 파일을 덮어 씁니다.
$ set -o noclobber
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
로 통과 >|
:
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:18:58 CET 2013
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:19:01 CET 2013
이 옵션을 설정 해제하거나 이미 설정했는지 문의하십시오.
$ set -o | grep noclobber
noclobber on
$ set +o noclobber
$ set -o | grep noclobber
noclobber off
$ date > $testfile ; cat $testfile
Mon Jan 7 13:24:27 CET 2013
$ rm $testfile
4-마지막 트릭 등 ...
주어진 명령의 두 출력을 리디렉션하기 위해 올바른 구문은 다음과 같습니다.
$ ls -ld /tmp /tnt >/dev/null 2>&1
이 특별한 경우에는 다음과 같은 바로 가기 구문이 있습니다. &>
... 또는>&
$ ls -ld /tmp /tnt &>/dev/null
$ ls -ld /tmp /tnt >&/dev/null
참고 : 2>&1
존재 1>&2
하는 경우 올바른 구문이기도합니다.
$ ls -ld /tmp /tnt 2>/dev/null 1>&2
4b- 이제 다음에 대해 생각해 보도록하겠습니다.
$ ls -ld /tmp /tnt 2>&1 1>&2 | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
$ ls -ld /tmp /tnt 1>&2 2>&1 | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
4c- 더 많은 정보에 관심이 있다면
다음을 누르면 훌륭한 매뉴얼을 읽을 수 있습니다.
man -Len -Pless\ +/^REDIRECTION bash
안에 세게 때리다 콘솔 ;-)