code

bash를 사용하면 표준 오류를 다른 프로세스에 파이프로 연결하려면 어떻게 해야 합니까?

starcafe 2023. 4. 28. 21:11
반응형

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 핸들을 만듭니다.3현재 핸들로 출력됩니다.1(원래 stdout), 아래의 최종 글머리 기호 포인트를 위해 어딘가에 저장하기 위해서입니다.
  • 1>&2핸들 수정1(stdout) - 현재 핸들로 출력합니다.2(원래 stderr).
  • 2>&3-핸들 수정2(stderr) - 현재 핸들로 출력합니다.3(원래 stdout) 그런 다음 핸들을 닫습니다.3(를 통해)-마지막에).

이것은 정렬 알고리즘에서 볼 수 있는 스왑 명령입니다.

temp   = value1;
value1 = value2;
value2 = temp;

Bash 4에는 다음과 같은 기능이 있습니다.

'|&'을 사용하는 경우, command1의 표준 오차는 파이프를 통해 command2의 표준 입력에 연결됩니다. 이것은 2>&1 |의 줄임말입니다.표준 오류에 대한 이 암묵적인 리디렉션은 명령에 의해 지정된 리디렉션 후에 수행됩니다.

zsh에도 이 기능이 있습니다.

--

다른/이전 셸의 경우 다음과 같이 명시적으로 입력합니다.

첫 번째 명령 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 오류를 더 적게 넣을 것입니다.

언급URL : https://stackoverflow.com/questions/1507816/with-bash-how-can-i-pipe-standard-error-into-another-process

반응형