bashスクリプトはパイプの標準出力にどのように書きますか? [コピー]

bashスクリプトはパイプの標準出力にどのように書きますか? [コピー]

関数を呼び出す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/outputBashでは、>(...)括弧の間のすべてのエントリが実行され、>(...)STDINに接続されたパイプパスに置き換えられます。

おすすめ記事