stderr가 파이프로 전송되고 있지만 나는 그것을 원하지 않습니다

stderr가 파이프로 전송되고 있지만 나는 그것을 원하지 않습니다

나는 이것을 가지고있다:

    echo "$some_command" | bash 2> >(prepend 'r2g-stderr:' 'red') | prepend 'r2g-stdout:' 'yellow';

내가 하려는 일:

r2g-stderr: this is some stderr
r2g-stderr: this is some more stderr
r2g-stderr: this is some mo mo stderr
r2g-stdout: this is some stdout
r2g-stdout: this more stdout

물론 r2g-stderr/r2g-stdout의 색상은 다릅니다.

문제는 내가 얻는 출력이 다음과 같다는 것입니다.

r2g-stdout: r2g-stderr: this is some stderr
r2g-stdout: r2g-stderr: this is some more stderr
r2g-stdout: r2g-stderr: this is some mo mo stderr
r2g-stdout: this is some stdout
r2g-stdout: this more stdout

프로세스 대체의 stderr이 어떻게든 두 번째 앞에 붙는 명령을 만들기 때문이라고 생각하는데, 어떻게 해야 할지 모르겠습니다.

답변1

prepend출력을 어디에서 인쇄합니까 ? 도착할 것인가 stderr, 도착할 것인가 stdout? 프로세스 교체가 cmd 2> >(procsub) | ...리디렉션을 상속한다고 생각합니다.stdout파이프라인으로 설정합니다.

프로세스 교체 명령의 출력을 명시적으로 다음으로 리디렉션하려면 다음과 같은 작업을 수행해야 합니다 stderr.

cmd 2> >(procsub >&2) | pipecmd

또는 파이프를 다른 프로세스로 교체합니다.

cmd 2> >(procsub) 1> >(pipecmd)

후자가 더 깔끔해 보이지만 이 경우 결과 출력은 모두 stdout(외부 환경)로 들어가고 프로세스 교체가 완료되기 전에 적어도 내 Bash가 프롬프트로 돌아가므로 출력이 Together 프롬프트와 혼합됩니다.

첫 번째는 작동합니다.

$ bash someoutput.sh  2> >(sed -e 's/^/ERR:/' >&2)  | sed -e 's/^/OUT:/'
ERR:error message
OUT:normal output

하지만 리디렉션 후에는 오류 출력과 정상 출력의 원래 순서가 마지막에 유지되지 않을 수 있다는 점을 명심하세요. 위의 스크립트는 실제로 normal output문자열을 먼저 인쇄하지만 위에서 언급한 것처럼 때로는 오류 줄이 먼저 표시됩니다.

관련 정보