
これは完璧に動作します:
./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>