標準出力から標準エラー出力へ?


17

あるプロセスのstdoutを別のプロセスのstdinに送信したいのですが、コンソールにも送信したいのです。たとえば、stdoutをstdout + stderrに送信します。

たとえば、私はgit edit次のエイリアスを持っています:

git status --short | cut -b4- | xargs gvim --remote

ファイル名のリストを画面とに送信したいのxargsですが。

だから、teeこれを行うようなユーティリティがありますか?次のようなことができるように:

git status --short | \
    cut -b4- | almost-but-not-quite-entirely-unlike-tee | \
    xargs gvim --remote

回答:


14

tee を使用して現在のコンソールに複製できます tee /dev/tty

git status --short | cut -b4- | tee /dev/tty | xargs gvim --remote

/dev/stdoutまたは/dev/stderr、使用することもできますが、コマンドがスクリプト内にある場合はリダイレクトすることもできます。/dev/tty常にコンソールになることに注意してください(非対話型シェルには存在しない場合があります)。 これは間違っています、コメントを読んでください。


1
実際、あなたが示すパイプラインで/dev/stdout リダイレクトされます。つまりtee /dev/stdout、エフェクトを使用している場合、すべてがxargs2回送信され、端末には何も送信されません。
celtschk 14

/dev/stdoutパイプによってリダイレクトされないため、現在のプロセスの標準出力のままになります。ただし、コマンドをスクリプトにカプセル化してから、このスクリプトの標準出力をリダイレクトすると、リダイレクト/dev/stdoutされます。インタラクティブコンソールに、tee /dev/ttyそしてtee /dev/stdoutパイプを用いても、同様の効果を有します。
ビンセントロバート14

あなたは私を信じていない場合は、お使いのシェルとタイプを開始echo foo | tee /dev/stdout | tr f bしてecho foo | tee /dev/tty | tr f b。ヒントは次のとおりです。ファイル名としてtee解釈さ/dev/stdoutれます。
celtschk 14

2
あなたは正しい、私はそれを見逃した方法がわからない。私は自分のシェルでttyとstdoutでいくつかのテストを行いましたが、どういうわけかそれを逃しました。説明をありがとう、間違った記述を削除しました。
ビンセントロバート14

さて、stderrはパイプの影響を受けないため、これを削除する必要はありません(もちろん、スクリプトリダイレクトの警告は残りますが、スクリプトの場合、一般にリダイレクト可能性は望ましいプロパティです)。
celtschk 14


3

例としてteeコマンドを使用し、STDERRファイルを入力するだけです。

tee /dev/stderr
tee /proc/self/fd/2

その場合、エイリアスは次のようになります。

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote

1
私はあなたが意味を考える/proc/self/fd/2
celtschk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.