stdout を右から左にリダイレクトする方法

stdout を右から左にリダイレクトする方法

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

./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、それを stdin として にパイプしますcat

この構文: は、<(echo "hello there!")コマンドを実行し、stdout を のようなファイル記述子にアタッチすることを意味します/dev/fd/65。式全体の結果は のようなテキストであり/dev/fd/65、コマンドが並列に実行され、そのファイル記述子に供給されます。

これで、スクリプトは右側のコマンドを実行し、それをファイル記述子にパイプし、そのファイル記述子を左側のコマンドの stdin に変換して、左側のコマンドを実行します。

私が知る限りオーバーヘッドはありません。これは とまったく同じで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>

関連情報