쉘에서 "2> & 1"은 무엇을 의미합니까?


2282

유닉스 쉘에서 추가 조작 을 위해 스트림 으로 결합 stderr하고 싶다면 명령 끝에 다음을 추가 할 수 있습니다.stdoutstdout

2>&1

따라서 head의 출력에서 사용하려면 g++다음과 같이 할 수 있습니다.

g++ lots_of_errors 2>&1 | head

처음 몇 개의 오류 만 볼 수 있습니다.

나는 항상 이것을 기억하는 데 어려움을 겪고 있으며 끊임없이 찾아야하며, 주로이 특정 트릭의 구문을 완전히 이해하지 못하기 때문입니다.

누군가 이것을 분해하여 성격별로 설명 할 수 있습니까 2>&1 ?


50
@dbr 나는 그것이 단지 bash라고 생각하지 않는다-나는 그것이 bourne shell 일이라고 믿는다. 따라서 sh, bash, ksh, ash, dash 등

8
이것은 POSIX 호환 쉘 또는 간단히 POSIX 쉘을 설명하는 리디렉션 단락의 일부입니다. ksh는 예를 들어 POSIX 쉘입니다. 다음을 참조하십시오 : pubs.opengroup.org/onlinepubs/009695399/utilities/…
jim mcnamara

12
이 구문은 Windows에서도 작동합니다.
Vadzim

2
2> / dev / null ;-) 2>&1보다 일반적으로 수행하는 것이 좋습니다.
F. Hauri

11
zsh를 사용 |& 하고 2>&1 |있다면 속기 라고 언급했습니다 . 다른 본과 같은 껍질에 적용되는지 또는 zsh 전용 기능인지 여부는 말할 수 없습니다.
chrixian

답변:


2554

파일 디스크립터 1은 표준 출력 ( stdout)입니다.
파일 디스크립터 2는 표준 오류 ( stderr)입니다.

첫째,에 : 여기에 (이 완전히 정확하지 않지만)이 구문을 기억하는 한 방법입니다 2>1리디렉션 할 수있는 좋은 방법처럼 보일 수 있습니다 stderr에가 stdout. 그러나 실제로는 " stderr이름이 지정된 파일로 리디렉션"으로 해석됩니다 1. &다음은 파일 설명자가 아니라 파일 설명 자임을 나타냅니다. 따라서 구문은 다음과 같습니다 2>&1.


281
그러나 오히려 그렇게해서는 안 &2>&1됩니까?
dokaspar

319
@Dominik : 아니요 &. 리디렉션 컨텍스트에서 "파일 설명자"만 의미하는 것으로 해석됩니다. 쓰기 command &2>&command &and 로 해석됩니다 2>&1. 즉, " command백그라운드에서 실행 한 다음 명령을 실행 2하고 stdout을 stdout으로 경로 재 지정"합니다.
Adam Rosenfield

15
그들은 왜 이런 비밀스러운 물건을 골랐습니까? 그냥 궁금해서
CommaToast 2014 년

81
그러나 stderr을 '& 1'이라는 파일로 어떻게 리디렉션합니까?
Martín Fixman

120
2>'&1'

632
echo test > afile.txt

stdout을로 리디렉션합니다 afile.txt. 이것은하는 것과 같습니다

echo test 1> afile.txt

stderr을 리디렉션하려면 다음을 수행하십시오.

echo test 2> afile.txt

>& 스트림을 다른 파일 설명 자로 리디렉션하는 구문입니다. 0은 stdin, 1은 stdout, 2는 stderr입니다.

다음을 수행하여 stdout을 stderr로 리디렉션 할 수 있습니다.

echo test 1>&2 # or echo test >&2

혹은 그 반대로도:

echo test 2>&1

즉, 2>stderr을 (지정되지 않은) 파일로 &1리디렉션하고 stderr을 stdout에 리디렉션합니다.


5
이것이 당신에게 어떤 의미가 있습니까 java ... 2&1 >> data.log, 나는 내 동료 중 한 명이 이것을 보았습니까?
Thang Pham

5
@Harry 그 bash는 아닌 쉘, 또는 오타 하나 같은 외모 .. cmd 2>&1 >> somefile.log것이다 APPEND 표준 출력 / 표준 에러 파일에 - 그것은으로, 기본적으로 상기와 동일합니다 >> file추가하려면
DBR

73
@dbr cmd 2>&1 >>file은 stderr을 파일로 리디렉션하지 않지만 cmd >> file 2>&1않습니다. 주문이 중요합니다. 첫 번째 경우, stderr은 쉘의 stdout으로 경로 재 지정되고 (명령이 대화식으로 입력되면 tty 일 수 있음) stdout이 파일로 보내집니다. 두 번째 경우, stdout은 파일로 보내진 후 stderr이 같은 위치로 보내집니다.
William Pursell

2
위의 답변이 마음에 들지만 터치가 더 명확 할 수 있습니다. "2> & 1"은 stderr을 stdout 대상으로 경로 재 지정합니다. 따라서 "ls -l >> directoryContents 2> & 1"과 같은 결과가 나오면 directoryContents라는 파일이 작업 디렉토리의 내용에 추가됩니다. 실행중인 오류가있는 경우 오류 메시지가 발생하면 directoryContents 파일에도 추가됩니다.
Max West

1
0(or 1,2)>&0(or 1,2)출력을 제어 할 수있는 옵션처럼? 가 echo test >test.log 2>&1동일 echo test 2>&1 >test.log?
Simin Jie

318

리디렉션에 대한 몇 가지 요령

이것에 대한 일부 구문 특수성은 중요한 동작을 가질 수 있습니다. 리디렉션에 대한 몇 가지 작은 샘플이 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 noclobberbash가 기존 파일을 덮어 쓰지 않도록 지시 하지만 >|구문을 사용하면 다음 과 같은 제한 사항을 통과 할 수 있습니다.

$ 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

안에 콘솔 ;-)


5
추가 독서 과제 : 이 내용이 마음에 들면 다음과 같이 계산할 수 있습니다. 리디렉션 남용이 이상한 행동을하는 방법
F. Hauri


130

나는 리디렉션에이 화려한 게시물을 발견 : 모든 재 지정에 대해

표준 출력 및 표준 오류를 파일로 리디렉션

$ 명령 &> 파일

이 단일 라이너는 &>연산자를 사용하여 출력 스트림 (stdout 및 stderr)을 명령에서 파일로 리디렉션합니다. 두 스트림을 동일한 대상으로 빠르게 리디렉션하기위한 Bash의 바로 가기입니다.

Bash가 두 스트림을 리디렉션 한 후 파일 디스크립터 테이블의 모습은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

보시다시피 stdout과 stderr은 이제를 가리 킵니다 file. 따라서 stdout 및 stderr에 작성된 내용은으로 기록됩니다 file.

두 스트림을 동일한 대상으로 리디렉션하는 방법에는 여러 가지가 있습니다. 각 스트림을 차례로 리디렉션 할 수 있습니다.

$ 명령> 파일 2> & 1

이것은 두 스트림을 파일로 리디렉션하는 훨씬 일반적인 방법입니다. 첫 번째 stdout이 파일로 경로 재 지정된 후 stderr이 stdout과 동일하도록 복제됩니다. 따라서 두 스트림이 모두를 가리 킵니다 file.

Bash가 여러 리디렉션을 발견하면 왼쪽에서 오른쪽으로 처리합니다. 단계를 수행하고 어떻게 발생하는지 봅시다. 명령을 실행하기 전에 Bash의 파일 디스크립터 테이블은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

이제 Bash는 첫 번째 리디렉션 파일을 처리합니다. 우리는 이것을 전에 보았고 stdout이 파일을 가리 키도록합니다.

여기에 이미지 설명을 입력하십시오

다음 Bash는 두 번째 리디렉션 2> & 1을 봅니다. 우리는 이전에이 리디렉션을 보지 못했습니다. 이것은 파일 디스크립터 2를 파일 디스크립터 1의 사본으로 복제하여 다음을 얻습니다.

여기에 이미지 설명을 입력하십시오

두 스트림 모두 파일로 리디렉션되었습니다.

그러나 여기서 조심하십시오! 쓰기

명령> 파일 2> & 1

쓰기와 동일하지 않습니다 :

$ 명령 2> & 1> 파일

Bash에서 리디렉션 순서가 중요합니다! 이 명령은 표준 출력 만 파일로 리디렉션합니다. stderr는 여전히 터미널에 인쇄됩니다. 그 이유를 이해하려면 단계를 다시 수행하십시오. 따라서 명령을 실행하기 전에 파일 디스크립터 테이블은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

이제 Bash는 리디렉션을 왼쪽에서 오른쪽으로 처리합니다. 먼저 2> & 1을보고 stderr을 stdout에 복제합니다. 파일 디스크립터 테이블은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

이제 Bash는 두 번째 경로 재 지정을보고 >filestdout을 파일로 경로 재 지정합니다.

여기에 이미지 설명을 입력하십시오

여기서 무슨 일이 일어나는지 보십니까? Stdout은 이제 파일을 가리 키지 만 stderr은 여전히 ​​터미널을 가리 킵니다! stderr에 기록되는 모든 내용이 여전히 화면에 인쇄됩니다! 따라서 리디렉션 순서에 매우주의하십시오!

또한 Bash에서 다음과 같이 작성하십시오.

$ 명령 &> 파일

정확히 다음과 같습니다.

$ 명령> & file


3
"command"가 숫자로 끝나는 경우 마지막 두 개는 달라집니다.>&
MM

아주 좋은 그림과 설명! "중복"이 실제로 무엇을 의미하는지 자세히 설명해 주시겠습니까? "이 파일 [2> & 1]은 (는) 파일 디스크립터 2를 파일 디스크립터 1의 사본으로 복제합니다"라고 언급했습니다. stderr이 stdout에 복제되는 것처럼 들립니다. 그러나 만일 그렇다면, 나는 또한 오류를보아야 /dev/tty0하는가?
HCSF

87

숫자는 파일 디스크립터 (fd)를 나타냅니다.

  • 제로 stdin
  • 하나는 stdout
  • stderr

2>&1 fd 2를 1로 리디렉션합니다.

프로그램에서 사용하는 파일 디스크립터 수에 관계없이 작동합니다.

/usr/include/unistd.h잊어 버린 경우 살펴볼 수 있습니다 .

/* Standard file descriptors.  */
#define STDIN_FILENO    0   /* Standard input.  */
#define STDOUT_FILENO   1   /* Standard output.  */
#define STDERR_FILENO   2   /* Standard error output.  */

즉, 사용자 정의 로깅에 비표준 파일 디스크립터를 사용하는 C 도구를 작성 했으므로 파일이나 파일로 리디렉션하지 않으면 볼 수 없습니다.


58

이 구문은 표준 오류 스트림 ( stderr)을 표준 출력 ( ) 의 현재 위치로 보냅니다. stdout이 통화 문제는 다른 답변에서 무시 된 것으로 보입니다.

이 방법을 사용하여 출력 핸들을 다른 출력 핸들로 리디렉션 할 수 있지만 처리를 위해 단일 스트림으로 채널링 stdoutstderr스트리밍 하는 데 가장 많이 사용됩니다 .

몇 가지 예는 다음과 같습니다.

# Look for ERROR string in both stdout and stderr.
foo 2>&1 | grep ERROR

# Run the less pager without stderr screwing up the output.
foo 2>&1 | less

# Send stdout/err to file (with append) and terminal.
foo 2>&1 |tee /dev/tty >>outfile

# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2

마지막 한 점에 유의 하지 지시 stderroutfile2- 그것은 무엇에 리디렉션 stdout인수가 발견되었을 경우에 (했다 outfile1)와 다음은 리디렉션 stdoutoutfile2.

이것은 꽤 정교한 속임수를 허용합니다.


5
마지막 예제는 다음과 같이 훨씬 명확하지만 foo> outfile2 2> outfile1
Michael Cramer

3
더 명확하지만, 이는 리디렉션의 "포지셔닝"특성을 나타내지 않습니다. 이 예제는 일반적으로 한 줄로 수행하는 것이 유용하지 않기 때문에 고안되었습니다.이 방법은 다른 당사자가 리디렉션의 다른 부분을 담당 할 때 실제로 유용합니다. 예를 들어, 스크립트가 한 비트의 리디렉션을 수행하고 다른 비트로 실행하는 경우.
paxdiablo 2016 년

5
: 난 그냥 마지막 예제도이 왜에 관한 한 오랜 혼란을 해결하는 것을 깨달았다 some_program 2>&1 > /dev/null과 같이 작동하지 않습니다 some_program > /dev/null 2>&1.
snapfractalpop

마지막 예제에 대한 귀하의 의견은 금으로 된 글자의 가치가 있습니다 :-) 나는 이러한 방향 전환 주장이 위치 적이라고 생각하지 않았습니다 ... 나는 이것이 매우 중요하다고 생각합니다.
Nils-o-mat

20

2>&1POSIX 쉘 구조입니다. 다음은 토큰 별 분류입니다.


2: " 표준 오류 "출력 파일 설명자.

>&: 출력 파일 디스크립터 연산자 ( 출력 재 지정 연산자 의 변형)를 복제합니다> . 주어지면 [x]>&[y], 파일 디스크립터에 의해 표시 x출력 디스크립터 파일의 복사본으로 이루어진다 y.

1" 표준 출력 "출력 파일 디스크립터.

이 표현식 2>&1은 파일 디스크립터 1를 location에 복사 2하므로 2실행 환경에서 ( "표준 오류")로 기록 된 출력 은 원래 1"표준 출력"으로 설명 된 것과 동일한 파일로 이동합니다 .


추가 설명 :

File Descriptor : "파일 액세스를 위해 열린 파일을 식별하는 데 사용되는 프로세스 별 고유 한 음이 아닌 정수입니다."

표준 출력 / 오류 : 쉘 설명서 의 리디렉션 섹션 에서 다음 참고 사항을 참조하십시오 .

열린 파일은 0으로 시작하는 10 진수로 표시됩니다. 가능한 최대 값은 구현 정의입니다. 그러나 모든 구현은 응용 프로그램에서 사용하기 위해 0-9 이상을 지원해야합니다. 이 번호를 "파일 디스크립터"라고합니다. 값 0, 1 및 2는 특별한 의미와 일반적인 용도를 가지며 특정 리디렉션 작업에 의해 암시됩니다. 이를 각각 표준 입력, 표준 출력 및 표준 오류라고합니다. 프로그램은 일반적으로 표준 입력에서 입력을 가져 와서 표준 출력에 출력을 씁니다. 오류 메시지는 일반적으로 표준 오류로 작성됩니다. 경로 재 지정 연산자 앞에는 파일 설명자 번호를 지정하기 위해 하나 이상의 숫자 (개입 문자가 허용되지 않음)가있을 수 있습니다.


19

2는 콘솔 표준 오류입니다.

1은 콘솔 표준 출력입니다.

이것은 표준 유닉스이며 Windows는 POSIX도 따릅니다.

예를 들어 달릴 때

perl test.pl 2>&1

표준 오류는 표준 출력으로 리디렉션되므로 두 출력을 함께 볼 수 있습니다.

perl test.pl > debug.log 2>&1

실행 후 debug.log에서 오류를 포함한 모든 출력을 볼 수 있습니다.

perl test.pl 1>out.log 2>err.log

그런 다음 표준 출력은 out.log로 이동하고 표준 오류는 err.log로 이동합니다.

이것들을 이해하려고 노력하십시오.


두 번째 샘플이 잘못되었습니다. 주문 우선 순위 STDERRSTDOUT 으로 리디렉션되면 기본 STDOUTdebug.log에 기록됩니다 ( STDERR 아님) 내 답변 (2 번 단락 )을 참조하십시오 ! 둘 다 동일한 파일로 리디렉션 되도록하려면 리디렉션 지시문을 반전시켜야합니다.perl test.pl > debug.log 2>&1
F. Hauri

16

귀하의 질문에 대답하려면 : 모든 오류 출력 (일반적으로 stderr으로 전송)을 표준 출력 (stdout)에 씁니다.

이것은 모든 출력에 페이징이 필요할 때 'more'와 같이 유용합니다. 사용 정보를 stderr에 인쇄하는 것과 같은 일부 프로그램.

당신이 기억할 수 있도록

  • 1 = 표준 출력 (프로그램이 정상 출력을 인쇄하는 경우)
  • 2 = 표준 오류 (프로그램이 오류를 인쇄하는 경우)

"2> & 1"은 단순히 stderr에 전송 된 모든 것을 stdout으로 지정합니다.

또한 이 주제에 대해 자세히 다루는 오류 리디렉션에 대한이 게시물을 읽는 것이 좋습니다 .


11

프로그래머의 관점에서 보면 정확히 다음을 의미합니다.

dup2(1, 2);

참고 항목 man 페이지를 .

즉 이해 2>&1A는 복사본 도하는 이유를 설명 ...

command >file 2>&1

...와 같지 않다 ...

command 2>&1 >file

첫 번째는 두 스트림을 모두로 보내고 두 file번째는에 오류를 보내고 stdout일반 출력 은로 보냅니다 file.


9

초보자가 읽을 수 있다면 나는이 매우 도움이 발견

업데이트 :
Linux 또는 Unix 시스템에는 프로그램이 출력을 보내는 두 곳이 있습니다 : 표준 출력 (stdout) 및 표준 오류 (stderr) . 이러한 출력을 모든 파일로 리디렉션 할 수 있습니다.

이렇게하면

ls -a > output.txt

콘솔에 아무것도 출력되지 않습니다. 모든 출력 (stdout) 은 출력 파일로 리디렉션됩니다.

종료하지 않는 파일의 내용을 인쇄하려고하면 현재 디렉토리에없는 test.txt를 인쇄하는 것처럼 출력이 오류가 발생

cat test.txt > error.txt

합니다.

cat: test.txt :No such file or directory

그러나 stdout을 stderr가 아닌 파일로 리디렉션하기 때문에 error.txt 파일이 비어 있습니다.

그래서 우리는 파일 디스크립터가 필요합니다 (파일 디스크립터는 열린 파일을 나타내는 양의 정수에 지나지 않습니다. 디스크립터는 파일의 고유 ID라고 말할 수 있습니다) 우리에게 파일에 어떤 유형의 출력을 보내고 있는지 쉘에 알려주십시오. 1은 stdout이고 2는 stderr 입니다.

이제 이렇게하면

ls -a 1> output.txt표준 출력 (stdout)을 output.txt로 보내는 것입니다.

그리고 그렇게하면

cat test.txt 2> error.txt표준 오류 (stderr)를 error.txt로 보내고 있음을 의미합니다.

&1파일 디스크립터 1 (stdout)의 값을 참조하는 데 사용됩니다.

이제 요점 2>&1은 "stder를 우리가 stdout을 리디렉션하는 동일한 위치로 리디렉션합니다"를 의미합니다.

이제 당신은 이것을 할 수 있습니다

cat maybefile.txt > output.txt 2>&1

표준 출력 (stdout)과 표준 오류 (stderr)는 모두 output.txt로 리디렉션됩니다.

지적 해 주신 Ondrej K. 에게 감사합니다 .


1
링크 만 답변에 문제가 있습니다. 응답이 쓸모없는 렌더링으로 인해 기능이 중단 될 수 있습니다. 항상 답변 자체에 충분한 세부 사항을 포함시켜야합니다.
Ondrej K.

7

사람들은 항상 기억 paxdiablo [정보의 힌트를 현재 그것은 ... 리디렉션 대상의 위치 입니다 중요합니다.

2>&1운영자의 개인적인 니모닉 은 다음과 같습니다.

  • 생각 &의미로 'and'또는 'add'(문자는입니다 ampers - , 그렇지?)
  • 따라서 ' 2(stderr)을 1(stdout)으로 현재 / 현재 리디렉션 하고 두 스트림을 모두 추가 합니다 . '

자주 사용되는 다른 리디렉션에도 동일한 니모닉이 작동합니다 1>&2.

  • &의미를 생각 and하거나 add... (앰퍼샌드에 대한 아이디어를 얻습니까?)
  • 따라서 ' (stderr)을 이미 / 현재 1있는 곳으로 리디렉션 2하고 두 스트림을 모두 추가하십시오 ' .

그리고 항상 기억하십시오 : 당신은 오른쪽에서 왼쪽으로 (왼쪽에서 오른쪽이 아닌) '끝에서'방향 전환 체인을 읽어야 합니다.


7

입력 리디렉션

입력을 리디렉션하면 파일 확장명 n에서 읽을 수 있도록 단어 확장으로 인해 이름이 지정된 파일이 열리거나 n이 지정되지 않은 경우 표준 입력 (파일 설명자 0)이 열립니다.

입력 리디렉션의 일반적인 형식은 다음과 같습니다.

[n]<word

출력 재 지정

출력 경로 재 지정은 단어의 확장으로 인해 이름이 지정된 파일이 파일 디스크립터 n에 쓰기 위해 열리거나 n이 지정되지 않은 경우 표준 출력 (파일 디스크립터 1)이됩니다. 파일이 존재하지 않으면 파일이 작성됩니다. 존재하는 경우 크기가 0으로 잘립니다.

출력 리디렉션의 일반적인 형식은 다음과 같습니다.

[n]>word

파일 디스크립터 이동

리디렉션 연산자

[n]<&digit-

파일 디스크립터 숫자를 파일 디스크립터 n으로 이동하거나 n이 지정되지 않은 경우 표준 입력 (파일 디스크립터 0)으로 이동합니다. n에 복제 된 후 숫자가 닫힙니다.

마찬가지로 리디렉션 연산자

[n]>&digit-

파일 디스크립터 숫자를 파일 디스크립터 n으로 이동하거나 n이 지정되지 않은 경우 표준 출력 (파일 디스크립터 1)으로 이동합니다.

참조 :

man bash

입력 /^REDIRECT받는 위치를 redirection섹션, 그리고 더 알아보기 ...

온라인 버전은 다음과 같습니다. 3.6 리디렉션

추신:

많은 시간 man이 Linux를 배우는 강력한 도구였습니다.


6

/foo귀하의 시스템에 존재하지 않으며 다음을 제공하는 경우 /tmp

$ ls -l /tmp /foo

의 내용을 /tmp인쇄하고에 대한 오류 메시지를 인쇄합니다/foo

$ ls -l /tmp /foo > /dev/null

의 내용을 보내드립니다 /tmp/dev/null와에 대한 오류 메시지를 인쇄/foo

$ ls -l /tmp /foo 1> /dev/null

정확히 똑같이 할 것입니다 ( 1 참고 )

$ ls -l /tmp /foo 2> /dev/null

내용을 인쇄하고 /tmp에 오류 메시지를 보냅니다/dev/null

$ ls -l /tmp /foo 1> /dev/null 2> /dev/null

목록과 오류 메시지를 모두에게 보냅니다. /dev/null

$ ls -l /tmp /foo > /dev/null 2> &1

속기입니다


5

이것은 stdout 또는 터미널에 오류를 전달하는 것과 같습니다.

즉, cmd명령이 아닙니다.

$cmd 2>filename
cat filename

command not found

오류는 다음과 같이 파일로 전송됩니다.

2>&1

표준 오류가 터미널로 전송됩니다.


1

입력의 경우 0, 표준 출력의 경우 1, stderr의 경우 2

하나의 팁 : somecmd >1.txt 2>&1반면, 올바른 somecmd 2>&1 >1.txt완전히이다 잘못된 아무 효과!


1

unix_commands 2>&1

터미널에 오류를 인쇄하는 데 사용됩니다.

다음은 프로세스를 보여줍니다

  • 오류가 발생 &2하면 표준 오류 스트림이 2참조 하는 표준 오류 메모리 주소 "버퍼"에 기록됩니다 .
  • 출력이 생성되면 &1표준 출력 스트림이 1참조 하는 표준 출력 메모리 주소 "버퍼"에 기록됩니다 .

따라서 unix_commands표준 오류 스트림을 가져 와서 오류의 스트림 을 표준 출력 메모리 주소로 2리디렉션 하여 터미널로 스트리밍되고 인쇄되도록하십시오.>&1

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.