껍질에서 "2> & 1"은 무엇을 의미합니까?
질문
UNIX 셸에서 Stederr과 STDOUT을 STDOUT 스트림으로 결합하려는 경우 추가 조작을 위해 다음 명령의 끝에 다음을 추가 할 수 있습니다.
2>&1
그래서, G ++에서 출력에서 머리를 사용하고 싶다면 다음과 같이 할 수 있습니다.
g++ lots_of_errors 2>&1 | head
그래서 처음 몇 가지 오류 만 볼 수 있습니다.
나는 항상 이것을 기억하는 데 어려움을 겪고 있으며, 끊임없이 그것을 찾아야합니다. 그리고 주로이 특정 트릭의 구문을 완전히 이해하지 못하기 때문입니다.
누군가가 이것을 깨뜨릴 수 있고 캐릭터 별 특성을 설명 할 수 있습니까? 2> & 1은 무엇을 의미합니까?
답변
파일 설명 자 1은 표준 출력 (stdout)입니다. 파일 설명자 2는 표준 오류 (stderr)입니다.
이 구성 요소를 기억하는 한 가지 방법이 있습니다 (완전히 정확하지는 않지만) : 첫째, 2> 1은 stderr을 stdout으로 리디렉션하는 좋은 방법처럼 보일 수 있습니다.그러나 실제로는 "stderr redirect stderr을 1"이라는 파일로 리다이렉트로 해석됩니다.& 다음과 같은 것이 파일 설명자가 아닌 파일 이름이 아닌 파일 설명 자입니다.따라서 구조물은 2> & 1이됩니다.
고려하십시오> & redirect 합병 연산자.
답변
echo test > afile.txt
stdout을 afile.txt로 리디렉션합니다.이것은 일과 같습니다
echo test 1> afile.txt
STDERR 리디렉션하려면 다음을 수행합니다.
echo test 2> afile.txt
SO> & & 스트림을 다른 파일 디스크립터로 리디렉션하는 구문입니다.
0은 stdin입니다 1은 stdout입니다 2는 stderr입니다
다음을 수행하여 STDERR로 stdout을 리디렉션 할 수 있습니다.
echo test 1>&2 # or echo test >&2
혹은 그 반대로도:
echo test 2>&1
따라서 Short ... 2> stderr을 (불특정) 파일로 리디렉션합니다.
답변
리디렉션에 대한 몇 가지 트릭
일부 구문 특수성에 대한 중요한 행동이있을 수 있습니다.리디렉션, Stderr, Stdout 및 인수 주문에 대한 몇 가지 샘플이 있습니다.
1 - 덮어 쓰기 또는 추가?
기호>는 리디렉션을 의미합니다.
> 전체 완성 된 파일로 보내기를 의미하며, 덮어 쓰기 대상 (# 3에서 # 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!새로운 버전의 bash (> 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은 특정 필터를 거치고 다른 필터로 이동하고 마지막으로 두 출력 모두 세 번째 명령 필터를 통해 병합됩니다.
2b - 사용 | & 대신
구문 명령 | & ... 명령 2> & 1의 별칭으로 사용할 수 있습니다..... 명령 줄 주문에 대한 동일한 규칙이 적용됩니다.자세한 내용은 운영자의 의미뿐입니다 | & bash에서?
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
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- 더 많은 정보에 관심이있는 경우
타격을 통해 훌륭한 설명서를 읽을 수 있습니다.
man -Len -Pless\ +/^REDIRECTION bash
bash 콘솔에서 ;-)
답변
나는 리디렉션에 대한이 훌륭한 게시물을 발견했다 : 리디렉션에 관한 모든 것
표준 출력 및 표준 오류를 모두 파일로 리디렉션하십시오.
$ Command &> File.
이 한 라이너는 &> 연산자를 사용하여 STDOUT 및 stderr - Command에서 파일까지의 STDOUT 및 stderr을 모두 리디렉션합니다.이것은 두 개의 스트림을 동일한 대상으로 빠르게 리디렉션하는 Bash의 바로 가기입니다.
다음은 Bash가 두 가지 스트림을 리디렉션 한 후 파일 설명자 테이블이 어떻게 보이는지입니다.

보시다시피 stdout과 stderr은 모두 파일을 가리 킵니다.그래서 stdout에 쓰여지고 stderr에 쓰여진 것은 파일에 기록됩니다.
두 스트림을 동일한 목적지로 리디렉션하는 몇 가지 방법이 있습니다.각 스트림을 다른 스트림을 재 지정할 수 있습니다.
$ 명령> 파일 2> & 1.
이는 두 스트림을 파일로 리디렉션하는 훨씬 더 일반적인 방법입니다.첫 번째 stdout은 파일로 리디렉션 된 다음 stderr이 stdout과 동일하게 복제됩니다.그래서 두 스트림이 파일을 가리키는 것을 끝냅니다.
Bash가 여러 방향으로 이동하면 왼쪽에서 오른쪽으로 처리합니다.단계를 통과하고 그런 일이 어떻게 일어나는지 보도록합시다.명령을 실행하기 전에 bash의 파일 설명자 테이블은 다음과 같습니다.

이제 Bash는 첫 번째 리디렉션> 파일을 처리합니다.우리는 이전에 이것을 보았습니다.

다음 Bash는 두 번째 리디렉션 2> & 1을 보았습니다.우리는 전에이 리디렉션을 보지 못했습니다.이 하나는 파일 설명 자 2가 파일 설명 자 1의 복사본이되어 다음과 같습니다.

두 스트림이 모두 파일로 리디렉션되었습니다.
그러나 여기 조심하십시오!쓰기
명령> 파일 2> & 1.
쓰는 것과 같지 않습니다.
$ 명령 2> & 1> 파일
Bash에서의 문제를 리디렉션하는 순서!이 명령은 표준 출력 만 파일로 리디렉션합니다.stderr는 여전히 터미널에 인쇄됩니다.왜 그런 일이 일어나는 이유를 이해하기 위해 다시 한번 간다 봅시다.따라서 명령을 실행하기 전에 파일 설명자 테이블은 다음과 같습니다.

이제 Bash 프로세스가 왼쪽으로 redirections입니다.그것은 처음 2> & 1이므로 stderr를 stdout으로 복제합니다.파일 설명 자 테이블은 다음과 같습니다.

이제 Bash는 두 번째 리디렉션,> 파일을보고 STDOUT을 파일로 리디렉션합니다.

여기서 무슨 일이 일어나는지 보이십니까?stdout은 이제 파일을 가리 킵니다. 그러나 stderr는 여전히 터미널을 가리 킵니다!stderr에 기록되는 모든 것이 여전히 화면에 인쇄됩니다!리디렉션의 순서로 매우 조심스럽게 조심하십시오!
또한 bash에서, 글쓰기
$ Command &> File.
다음과 같습니다.
$ 명령> & FILE.
답변
숫자는 파일 설명자 (FD)를 참조합니다.
0은 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로 지시하지 않습니다. - 인수가 발생했을 때 (outfile1) STDOUT을 outfile2로 리디렉션합니다.
이것은 꽤 정교한 속임수를 허용합니다.
출처:https://stackoverflow.com/questions/818255/in-the-shell-what-does-21-mean
최근댓글