문제

Unix shell,하고 싶은 경우에 결합 stderrstdoutstdout 스트림에 대한 추가 조작,내가 할 수 있습 추가하려면 다음과 같은 끝에는 나의 명령:

2>&1

경우에 따라서,사용하고 싶 head 에서 출력 g++, 에,나는 다음과 같이 할 수 있다:

g++ lots_of_errors 2>&1 | head

그래서만 볼 수 있는 첫 번째 몇 가지 오류가 있습니다.

나는 항상 문제가 이것을 기억하고,내가 지속적으로 이것,그리고 그것은 주로하기 때문에 완전히 이해하지 않는 구문의 이 특정한다.

할 수 있는 사람이 이것을 설명하고 문자를 무엇 2>&1 을 의미합니까?

도움이 되었습니까?

해결책

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

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

다른 팁

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으로 리디렉션합니다.

일부에 대한 비용이 리다이렉션

어떤 구문은 특수성이 있는 중요한 동작을 적용할 수 있습니다.거기에 몇 가지 작은 샘플에 대해 리다이렉션, STDERR, STDOUT, 고,인수 주문.

1-를 덮어쓰거나 추가?

기호 >리디렉션.

  • >보내기 전체 완료된 파일,덮어 쓰기 대상에 존재하는 경우(참조하십시오 noclobber bash 기능 #3 나중에).
  • >>보내기에 추가하는 대상에 존재하는 경우.

어떤 경우에,파일 생성되는 경우 그들은 존재하지 않습니다.

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

Nota: &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

특수 케이스,거기에 바로 가기 syntax: &> ...나 >&

$ ls -ld /tmp /tnt &>/dev/null

$ ls -ld /tmp /tnt >&/dev/null

Nota:는 경우 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-에 관심이 있는 경우 more 정보

읽을 수 있는 미세한 설명에 의해 타격:

man -Len -Pless\ +/^REDIRECTION bash

콘솔;-)

이 화려한 포스트에서 리다이렉션: 에 대한 모든 리다이렉션

Redirect 표준출력과 표준오류의 파일

$명령&>파일

이것은 사용 &> 연산자를 모두를 리디렉션하는 출력 스트림-stdout 및 stderr-에서 명령하는 파일입니다.이 Bash 의 바로 가기 위해 빠르게 리다이렉션을 모두 스트림 같은 대상입니다.

는 방법은 다음과 같습니다:파일 설명자에는 테이블처럼 보인 후 Bash 는 리디렉션된 모두 스트림:

Enter image description here

당신이 볼 수 있듯이,stdout 및 stderr 지점을 file.그래서 아무것도 기록되 stdout 및 stderr 가져옵 기록 file.

여러 가지 방법이 있을 리디렉션 둘 스트림을 같은 대상입니다.리디렉션할 수 있습니다 각각의 흐른 후 하나:

$명령>파일 2>&1

이것은 훨씬 더 많은 일반적인 방법으로 리디렉션하려면 모두 스트림이 있습니다.첫 번째 stdout 로 리디렉션된 파일,다음 stderr 은 중복 될 것 같은 stdout.그래서 둘 스트림을 끝까지 가리키는 file.

때 Bash 보고 여러 가지로 리디렉션 그것은 프로세스에서 그들을 오른쪽으로 남아 있습니다.Let's go 단계를 통해 어떻게 일어난다.실행하기 전에 모든 명령을 강타의 파일 설명자의 테이블은 다음과 같습니다:

Enter image description here

지금 Bash 프로세스 첫번째 리다이렉션>파일입니다.우리가 전에 본 적이고 표준출력으로 출력 포인트 파일:

Enter image description here

다음 Bash 보고 두 번째는 리다이렉션 2>&1.우리는 보지 못했 리다이렉션을 하기 전에.이 하나의 중복 파일 설명 2 하의 복사본을 파일 기술자 1 고 우리는 얻을:

Enter image description here

모두 시내는 리다이렉션된 파일입니다.

그러나 여기서 조심!쓰

명령>파일 2>&1

지 않을 쓰는 것과 같은:

$명령 2>&1>파일

의 순서로 리디렉션에서 중요한 Bash!이 명령을 리디렉션만을 출력하는 파일입니다.Stderr 것 인쇄 터미널도 있습니다.는 이유를 이해하는 일이 가자면 전체 단계를 다시 수행합니다.그래서 명령을 실행하기 전에,파일 설명자의 테이블은 다음과 같습니다:

Enter image description here

지금 Bash 프로세스 리다이렉션 오른쪽으로 남아 있습니다.그것은 처음 본 2>&1 그 중복 stderr 에 stdout.파일 설명자의 테이블 된다:

Enter image description here

지금 Bash 보고 두 번째는 리다이렉션 >file, 고,그것을 리디렉션 stdout 일:

Enter image description here

당신은 어떻게 볼까요?Stdout 지금 포인트 파일이지만,stderr 도하는 점이다.모든 것을 얻을 작성하 stderr 여전히 인쇄 화면!그래서 매우,매우 조심의 순서와 리디렉션!

또한 Bash,쓰기

$명령&>파일

은 정확히 동일:

$명령>&file

숫자는 파일 설명자 (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 도구를 작성 했으므로 파일이나 무언가로 리디렉션하지 않으면 볼 수 없습니다.

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

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

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

# 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

그 마지막은 그럴 것입니다 ~ 아니다 직접 stderr 에게 outfile2 - 그것은 무엇으로 리디렉션됩니다 stdout 논쟁이 발생했을 때 (outfile1) 그리고 그 다음에 리디렉션 stdout 에게 outfile2.

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

2>&1 POSIX 쉘 구성입니다. 다음은 토큰의 토큰입니다.


2: "표준 에러"출력 파일 디스크립터.

>&: 출력 파일 디스크립터를 복제하십시오 연산자 (변형 출력 리디렉션 운영자 >). 주어진 [x]>&[y], 파일 설명자는 x 출력 파일 디스크립터의 사본으로 만들어졌습니다. y.

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

표현식 2>&1 파일 디스크립터를 복사합니다 1 위치로 2, 그래서 모든 출력 2 ( "표준 오류") 실행 환경에서 원래 설명하는 동일한 파일로 이동합니다. 1 ( "표준 출력").


추가 설명 :

파일 설명자: "파일 액세스 목적으로 열린 파일을 식별하는 데 사용되는 고유 한 비 음성 정수."

표준 출력/오류: 다음 주 참고 사항을 참조하십시오 리디렉션 쉘 문서 섹션 :

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

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

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

이것은 표준 Unix이며 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로 이동합니다.

이것들을 이해하려고 노력할 것을 제안합니다.

질문에 답하기 위해 : 오류 출력 (일반적으로 STDERR로 전송)이 필요하고 표준 출력 (STDOUT)에 씁니다.

예를 들어 모든 출력에 페이징이 필요할 때 예를 들어 'More'에 도움이됩니다. 사용 정보를 Stderr로 인쇄하는 것과 같은 일부 프로그램.

당신이 기억하는 데 도움이됩니다

  • 1 = 표준 출력 (프로그램이 일반 출력을 인쇄하는 곳)
  • 2 = 표준 오류 (프로그램이 오류를 인쇄하는 위치)

"2> & 1"은 단순히 stderr로 보내진 모든 것을 대신 stdout으로 가리 킵니다.

나는 또한 읽는 것이 좋습니다 오류에 대한이 게시물은 리디렉션됩니다 이 주제가 자세히 설명되어 있습니다.

프로그래머의 관점에서 볼 때 이것은 정확하게 이것을 의미합니다.

dup2(1, 2);

참조 남자 페이지.

그것을 이해합니다 2>&1 a 복사 또한 왜 ...

command >file 2>&1

...와 같지 않습니다 ...

command 2>&1 >file

첫 번째는 두 스트림을 보냅니다 file, 두 번째는 오류를 보냅니다 stdout, 및 일반적인 출력 file.

사람들, 항상 기억하십시오 Paxdiablo에 대한 힌트 현재의 리디렉션 대상의 위치 ... IT ~이다 중요한.

내 개인적인 니모닉 2>&1 연산자는 다음과 같습니다.

  • 에 대해 생각하다 & 의미로 'and' 또는 'add' (캐릭터는 an입니다 앰퍼-그리고, 그렇지 않습니까?)
  • 그래서 그것은 다음과 같습니다. '리디렉션 2 (stderr) 어디로 1 (stdout) 이미/현재입니다 추가하다 두 스트림 모두 '.

동일한 니모닉은 자주 사용되는 다른 리디렉션에도 효과가 있습니다. 1>&2:

  • 에 대해 생각하다 & 의미 and 또는 add... (당신은 앰퍼 샌드에 대한 아이디어를 얻습니다, 예?)
  • 그래서 그것은 다음과 같습니다. '리디렉션 1 (stdout) 어디로 2 (stderr) 이미/현재입니다 추가하다 두 스트림 모두 '.

그리고 항상 기억하십시오 : 당신은 '끝에서', 오른쪽에서 왼쪽으로 리디렉션의 사슬을 읽어야합니다 (~ 아니다 왼쪽에서 오른쪽으로).

제공했습니다 /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

속기입니다

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

그건, cmd 명령이 아닙니다.

$cmd 2>filename
cat filename

command not found

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

2>&1

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

입력 리디렉션

입력의 리디렉션은 파일 디스크립터 n에서 읽기를 위해 단어 확장으로 이름이 열리거나 n이 지정되지 않은 경우 표준 입력 (파일 디스크립터 0)의 이름이 발생하는 파일을 발생시킵니다.

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

[n]<word

출력 리디렉션

출력의 리디렉션은 파일 디스크립터 n에 쓸 수 있도록 단어 확장으로 이름이 나오거나 n이 지정되지 않은 경우 표준 출력 (파일 디스크립터 1)의 이름이 발생하는 파일이 발생합니다. 파일이 존재하지 않으면 생성됩니다. 그것이 존재한다면 그것은 제로 크기로 잘린다.

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

[n]>word

움직이는 파일 설명자

리디렉션 연산자,

[n]<&digit-

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

마찬가지로 리디렉션 연산자도 마찬가지입니다

[n]>&digit-

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

ref :

man bash

유형 /^REDIRECT 위치를 찾습니다 redirection 섹션하고 더 배우십시오 ...

온라인 버전이 여기에 있습니다. 3.6 리디렉션

추신:

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

입력의 경우 0, stdout의 경우 1, stderr의 경우 2.

하나의 팁: somecmd >1.txt 2>&1 맞습니다 somecmd 2>&1 >1.txt 완전히입니다 잘못된 효과가 없습니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top