web-dev-qa-db-ja.com

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

これは完全に機能します:

./foo | ./bar

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

./bar <| ./foo

そのため、パイプラインを逆にして、コマンドラインでfooの引数をより速く変更できます。

パイプはリアルタイムである必要があります-私のfooプログラムは決して戻りません。

これは可能ですか?

8
Bilow
_./bar < <( ./foo )
_

例:cat < <(echo "hello there!")

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

この構文:_cat < /path/to/file_は、ファイル_/path/to/file_を読み取り、それをstdinとしてcatにパイプします。

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

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

私が知っているオーバーヘッドはありません。それは_a | b_とまったく同じで、構文上の糖衣です。

2
VasyaNovikov

シンプルで適切な方法は、foobar関数を定義することです。

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

(必要に応じてコマンドラインで、または「.bashrc」などの一部の起動スクリプトで)。その後、いつでも:

foobar "this"  that   "and this also"

それはします

./foo  this   that   "and this also" | ./bar
9
Olivier Dulac

名前付きパイプを使用すると、次のようなことができると思います。

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>
4
ilkkachu