[bash] bash를 사용하면 표준 오류를 다른 프로세스에 어떻게 파이프 할 수 있습니까?

프로세스의 표준 출력을 다른 프로세스 표준 입력으로 파이프하는 방법은 잘 알려져 있습니다.

proc1 | proc2

그러나 proc1의 표준 오류를 proc2로 보내고 표준 출력을 현재 위치로 유지하려면 어떻게해야합니까? bash다음 줄을 따라 명령을 내릴 것이라고 생각합니다 .

proc1 2| proc2

그러나 아아, 아닙니다. 이것을 할 수있는 방법이 있습니까?



답변

또한이 공정 대체 . 프로세스가 파일을 대체합니다. 다음과 같이 파일을
보낼 수 있습니다 stderr.

process1 2> file

그러나 다음과 같이 파일 프로세스를 대체 할 수 있습니다.

process1 2> >(process2)

다음은 stderr화면 모두에 보내고 로그 파일에 추가 하는 구체적인 예입니다.

sh myscript 2> >(tee -a errlog)


답변

당신은에 다음과 같은 트릭을 사용할 수 있습니다 스왑 stdoutstderr. 그런 다음 일반 파이프 기능 만 사용하십시오.

( 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 오류를 덜 넣을 것입니다.


답변