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