동일한 메시지를 stdoud 및 stderr로 리디렉션하는 방법(임시 개체 없이)

동일한 메시지를 stdoud 및 stderr로 리디렉션하는 방법(임시 개체 없이)

1>&1stdout 또는 stderr은 및/또는 을 사용하여 >&2동일한 출력(파일 또는 2개의 std 출력 중 하나)으로 쉽게 리디렉션될 수 있습니다 >file. 동일한 출력을 KSH의 두 std 출력으로 보내는 방법이 있습니까(| tee 파일과 유사하지만 파일에 &2 사용)? stdout과 stderr 모두에 스트림을 보내려고 했지만(각 채널에 하나씩 출력 복사) 임시 개체(변수 또는 파일)를 사용하지 않았습니다.

임시 변수를 사용하지만 이를 피하려고 합니다.

Tempo="$(
   #all my code with output to stdout and stderr
   )"
echo "${Tempo}"
echo "${Tempo}" >&2

질문자:스택 오버플로여기에 질문을 제안하세요

답변1

시스템에 없는 경우 다음 방법을 /dev/stderr사용할 수 있습니다 perl.

{
  your-code
  ..
} | perl -pe 'print STDERR'

perl입력은 한 번에 한 줄씩 처리되므로 부분 줄은 표시되지 않습니다. 예를 들어 다음 코드를 사용합니다.

printf 'Foo'; sleep 2; printf 'Bar\n'

FooBar2초 후에 보실 수 있습니다.

또한 일부 명령은 터미널로 전송되지 않을 때 출력을 버퍼링하므로 출력이 완료되는 방식에 영향을 미칠 수 있습니다.

답변2

ksh이런 일을 할 수 있는 기능이 있는지는 모르겠습니다 . zsh(이 기능을 사용하여) 수행할 수 있습니다 multios.

하지만 방법이 있습니다 tee.

echo foo | tee /dev/stderr
echo foo | tee /proc/self/fd/2

관련 정보