標準出力を右から左にリダイレクトする方法

標準出力を右から左にリダイレクトする方法

これは完璧に動作します。

./foo | ./bar

しかし、私は次のようなものが欲しい:

./bar <| ./foo

したがって、逆の方法でパイプすることで、コマンドラインでfooのパラメータをすばやく変更できます。

パイプラインはライブ状態でなければなりません。私のfooプログラムは決して返されません。

可能ですか?

答え1

簡単で正しい方法はfoobar関数を定義することです。

foobar () { ./foo "$@" | ./bar ; }

(必要に応じて、コマンドラインまたは「.bashrc」などの一部の起動スクリプトで)。次に、次の操作を行うたびに:

foobar "this"  that   "and this also"

する

./foo  this   that   "and this also" | ./bar

答え2

./bar < <( ./foo )

たとえば、cat < <(echo "hello there!")

これがどのように機能するかを理解するには、スクリプトの各部分を個別に検討してください。

この構文はcat < /path/to/fileファイルを読み取り、/path/to/file標準入力としてcat

この構文は、<(echo "hello there!")コマンドを実行し、ファイル記述子に標準出力を追加することを意味します。たとえば、/dev/fd/65式全体の結果は次のテキストであり、並列/dev/fd/65に実行され、対応するファイル記述子を提供するコマンドです。

結合されたスクリプトは右側のコマンドを実行し、それをファイル記述子にパイプし、そのファイル記述子を左側のコマンドの標準入力に変換し、左側のコマンドを実行します。

私が知る限り、オーバーヘッドはなく、まったく同じですが、a | b構文上の砂糖だけです。

答え3

名前付きパイプを使用すると、同様のことができるようです。

mypipe=$(mktemp -d /tmp/XXXXXX)/pipe
mkfifo $mypipe
grep something < $mypipe & tail > $mypipe -f  some_input_file 
rm $mypipe

または、コマンドの変更されていない部分をシェルスクリプトに入れます。

./foo "$@" | ./bar

fooスクリプトコマンドラインに引数を提供します。

./myscript <args to foo>

関連情報