나는 이것을 가지고있다:
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
문자열을 먼저 인쇄하지만 위에서 언급한 것처럼 때로는 오류 줄이 먼저 표시됩니다.