[bash] bash를 사용하면 표준 오류를 다른 프로세스에 어떻게 파이프 할 수 있습니까?
프로세스의 표준 출력을 다른 프로세스 표준 입력으로 파이프하는 방법은 잘 알려져 있습니다.
proc1 | proc2
그러나 proc1의 표준 오류를 proc2로 보내고 표준 출력을 현재 위치로 유지하려면 어떻게해야합니까? bash
다음 줄을 따라 명령을 내릴 것이라고 생각합니다 .
proc1 2| proc2
그러나 아아, 아닙니다. 이것을 할 수있는 방법이 있습니까?
답변
또한이 공정 대체 . 프로세스가 파일을 대체합니다. 다음과 같이 파일을
보낼 수 있습니다 stderr
.
process1 2> file
그러나 다음과 같이 파일 프로세스를 대체 할 수 있습니다.
process1 2> >(process2)
다음은 stderr
화면 모두에 보내고 로그 파일에 추가 하는 구체적인 예입니다.
sh myscript 2> >(tee -a errlog)
답변
당신은에 다음과 같은 트릭을 사용할 수 있습니다 스왑 stdout
및 stderr
. 그런 다음 일반 파이프 기능 만 사용하십시오.
( proc1 3>&1 1>&2- 2>&3- ) | proc2
처음에 동일한 장소를 제공 stdout
하고 제공 stderr
하면 필요한 것을 얻을 수 있습니다.
무엇 x>y
비트가하는 일은 파일 핸들을 변경하는 것입니다 x
지금 어디에 파일 핸들이 해당 정보 전송 있도록 y
현재 포인트. 특정 사례의 경우 :
3>&1
아래의 마지막 글 머리 기호를 위해 어딘가에 저장 하기 위해 현재 핸들 (원래 stdout)에 출력 할 새 핸들3
을 만듭니다 .1
1>&2
핸들1
(stdout)을 수정 하여 현재 핸들2
(original stderr)로 출력합니다.2>&3-
핸들2
(stderr)을 수정 하여 현재 핸들3
(원래 stdout )로 출력 한 다음3
(-
끝을 통해) 핸들을 닫습니다 .
효과적으로 정렬 알고리즘에서 볼 수있는 swap 명령입니다.
temp = value1;
value1 = value2;
value2 = temp;
답변
Bash 4에는이 기능이 있습니다.
`| & ‘를 사용하면 command1의 표준 오류는 파이프를 통해 command2의 표준 입력에 연결됩니다. 2> & 1 |의 약어입니다. 표준 오류의 암시 적 리디렉션은 명령으로 지정된 리디렉션 후에 수행됩니다.
zsh에도이 기능이 있습니다.
–
다른 / 이전 쉘에서는 다음과 같이 명시 적으로 입력하십시오.
FirstCommand 2> & 1 | 다른 명령
답변
스와핑은 문제를 해결하므로 훌륭합니다. 원래 stdout이 필요하지 않은 경우 다음과 같이 할 수 있습니다.
proc1 2>&1 1>/dev/null | proc2
순서는 매우 중요합니다. 당신은 원하지 않을 것입니다 :
proc1 >/dev/null 2>&1 | proc1
이것으로 모든 것을 리디렉션합니다 /dev/null
!
답변
이들 중 어느 것도 실제로 잘 작동하지 않았습니다. 내가 찾은 가장 좋은 방법은 다음과 같습니다.
(command < input > output) 2>&1 | less
command
키보드 입력이 필요하지 않은 경우에만 작동합니다 . 예 :
(gzip -d < file.gz > file) 2>&1 | less
gzip 오류를 덜 넣을 것입니다.