これは完全に機能します:
./foo | ./bar
しかし、私はそのようなものが欲しい:
./bar <| ./foo
そのため、パイプラインを逆にして、コマンドラインでfooの引数をより速く変更できます。
パイプはリアルタイムである必要があります-私のfoo
プログラムは決して戻りません。
これは可能ですか?
_./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
_とまったく同じで、構文上の糖衣です。
シンプルで適切な方法は、foobar関数を定義することです。
foobar () { ./foo "$@" | ./bar ; }
(必要に応じてコマンドラインで、または「.bashrc」などの一部の起動スクリプトで)。その後、いつでも:
foobar "this" that "and this also"
それはします
./foo this that "and this also" | ./bar
名前付きパイプを使用すると、次のようなことができると思います。
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>