답변:
때로는 stdout 과 stderr을 동일한 위치 로 리디렉션하려고합니다. 이때 >&
사용됩니다. 파일 설명자를 다른 파일 디스크립터로 가리 킵니다.
예를 들어 stdout과 stderr을 모두 같은 파일 ( /dev/null
또는 파일)에 쓰려면 다음을 사용 output.txt
하여 개별적으로 리디렉션 할 수 있습니다.
app 1>/dev/null 2>/dev/null
또는 하나의 파일 설명자를 파일로 리디렉션하고 다른 파일 설명자를 첫 번째 설명 자로 리디렉션 할 수 있습니다.
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
첫 번째 예에서는 2>&1
파일 설명자 # 2를 # 1이 이미 가리키는 위치를 가리 킵니다. 두 번째 예제는 stderr로 시작하여 동일한 결과를 얻습니다.
다른 예로, stdout (파일 설명자 # 1)이 이미 원하는 위치를 가리키고 있지만 이름으로 참조 할 수없는 경우가 있습니다 (파이프, 소켓 등과 연관 될 수 있음). 이는 일반적으로 stdout 만 캡처하는 프로세스 확장 ( ` `
또는 $( )
연산자)을 사용할 때 발생 하지만 stderr을 포함시킬 수 있습니다. 이 경우 >&
stderr이 stdout을 가리 키도록 사용할 수도 있습니다 .
out=$(app 2>&1)
다른 일반적인 예는 호출기 grep
또는 유사한 유틸리티입니다. 파이프는 |
일반적으로 stdout에서만 작동하므로 파이프를 사용하기 전에 stderr을 stdout으로 리디렉션합니다.
app 2>&1 | grep hello
어떻게 어떤 알고 2>&1
또는 1>&2
정확? 이미 설정 파일 기술자가 오른쪽으로 이동 >&
하고, 리디렉션 할 파일 기술자는 왼쪽으로 간다. ( 2>&1
"파일 디스크립터 # 2에서 파일 디스크립터 # 1"을 의미합니다.)
일부 셸에는 일반적인 리디렉션에 대한 바로 가기가 있습니다. Bash의 예는 다음과 같습니다.
1>
그냥 단축 할 수 있습니다 >
1>foo 2>&1
에 >&foo
나&>foo
2>&1 | program
에 |& program
the already set up fd goes to the right of >&, and the fd you want to redirect goes to the left
있습니다. 이미 설정된 파일 디스크립터 란 무엇을 의미합니까? 의 권리는 무엇을 의미합니까?
필요할 때 한 가지 상황 strace
은 호출기에 출력 을 표시하려는 경우 입니다. strace
출력을 표준 오류에 출력 하고 파이프는 일반적으로 표준 출력 을 표준 입력에 연결 하므로 리디렉션을 사용해야합니다.
strace -p $pid 2>&1 | less
pipes generally connect standard output to standard input
?
|
)는 첫 번째 명령의 표준 출력을 가져와 두 번째 명령의 표준 입력에 연결합니다.
2 : 표준 오류와 표준 출력에서 출력을 가져오고 단일 문자열로 구성하려는 경우를위한 것입니다.
1 : 표준 오류와 표준 출력의 출력을 조작하려는 경우.
>2
것이 / dev / null로 전송 된다는 것 입니다. 아니면 내가 잘못 알고 있습니까?
분리 된 작업을 시작하는 데 사용합니다.
someProgram 2>&1 >& my.log &
그런 다음 로그 아웃 할 수 있으며 일부 프로그램은 여전히 실행 중입니다. 이 기능은 GNU Screen, tmux 및 일부 다른 프로그램에서 제공하지만 외부 종속성 없이는 달성 할 수 있습니다.
nohup
또는 disown
그러한 경우에.
try
다음 세 파일 이있는 디렉토리가 있다고 상상해보십시오 .file file1 and file2.
이제이 명령을 실행하십시오 :
cat file file1 file2 file3
처음 세 파일은 열리지 만 cat
존재하지 않는 네 번째 파일을 여는 동안 오류가 발생합니다.
이제 다음을 실행하십시오.
cat file file1 file2 file3 1>outfile 2>&1
첫째 : 당신은 화면에 출력을 볼 수 없습니다 1>outfile
에 대한 명령의 출력을 리디렉션합니다 outfile
다음은 (리디렉션 2>&1
열려고하는 동안 오류가 발생) file3
에 outfile
.
1>&2
비슷하게 작동하고 오류 스트림을 표준 출력으로 리디렉션합니다.
이것이 도움이되기를 바랍니다!
대체 시나리오 : 터미널 명령은 다른 터미널로 출력을 표시합니다.
tty
각 터미널 에서 명령을 사용하여 식별하십시오.
$ tty
/dev/pts/0
$ tty
/dev/pts/1
이 TTY를 가정하면 첫 번째 stdout을 두 번째 stdout으로 리디렉션하려면 첫 번째 터미널에서 다음을 실행하십시오.
exec 1>/dev/pts/1
참고 : 이제 모든 명령 출력 이 pts / 1에 표시됩니다.
pts / 0의 기본 동작 stdout을 복원하려면 다음을 수행하십시오.
exec 1>/dev/pts/0
데모는 이 비디오 를 참조하십시오 .
app 1>/dev/null 2>&1
2> & 1이 1이 이미 리디렉션하고있는 파일을 가리킬 것이라는 것을 몰랐다 . 내가 할 수있는 것처럼 쉽게 할 수app > /dev/null &>
있습니까?