同じメッセージをstdoudとstderrにリダイレクトする方法(一時オブジェクトなし)

同じメッセージをstdoudとstderrにリダイレクトする方法(一時オブジェクトなし)

1>&1stdoutまたはstderrは、および/またはを使用して>&2同じ出力(ファイルまたは2つのstd出力のいずれか)に簡単にリダイレクトできます>file。同じ出力をKSHの2つのstd出力に送信する方法はありますか(| teeファイルに似ていますが、ファイルに&2を使用) stdoutとstderrの両方にストリームを送信しようとしましたが(各チャンネルに1つずつ出力をコピー)、一時オブジェクト(変数またはファイル)を使用しませんでした。

一時変数を使用しますが、これを回避しようとしています。

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入力は一度に1行ずつ処理されるため、部分行は表示されません。たとえば、次のコードを使用します。

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

関連情報