関数を呼び出すbashスクリプトがあります。とりわけ、この関数は出力を受け取るパイプを実行します。簡単にするために、以下は人為的な例です。
#!/bin/bash
func() {
ls "$@" | sort | rev > /tmp/output
}
func "$@"
次に、実行するためにそのようなタスクを実行します。そのアクションを実行し、ペイロードをファイルに渡します。画面に出力がありません。
$ ./myscript .
sort
それでは、出力を標準出力として欲しいとしましょう。どうすればいいですか?
私はこれを次のように達成できます。
ls "$@" | sort | tee /dev/tty | rev > /tmp/output
しかし、以下を/dev/tty
使用するのは間違っています。
$ ./myscript > myfile
関数内のパイプ内でbashスクリプトの標準出力を参照するより正しい方法はありますか?
(私はArch Linuxでbash 4.3.0を使用しています)
ベストアンサー1
私が考えることができる最も簡単な方法は次のとおりです。
ls "$@" | sort | tee >(rev > /tmp/output)
tee
コピーはSTDOUTに転送され、その後にaがなくなったため、|
これが継承されます。つまり、リダイレクトがない場合はTTYに移動し、myfile
そうであればTTYに移動します。別のコピーが対応するSTDIN
に送信されます。rev > /tmp/output
Bashでは、>(...)
括弧の間のすべてのエントリが実行され、>(...)
STDINに接続されたパイプパスに置き換えられます。