入力/出力ファイルでのみ機能するプログラムをパイプラインに含めるにはどうすればよいですか?

入力/出力ファイルでのみ機能するプログラムをパイプラインに含めるにはどうすればよいですか?

パイプラインで複数のツールを使用して画像を処理する必要がありますtool1 | tool2 | tool3 | ...。しかし、ツールの1つはパイプラインで動作するように設計されていないようですuser@computer:/~# bad_tool infile.png outfile.png

これをパイプラインに統合する方法はありますか?私はこの唯一のプログラムのためのファイルを作成して削除するなどの作業を避けたいと思います。

答え1

パイプが一般的に次のような場合:

tool1 | tool2 | tool3

しかし、ツール2は「悪い」。 2つのパラメータを使用します(最初は入力ファイル、2番目は出力ファイル)。次のように書き換えることができます。

tool2 <(tool1) >(tool3)

もちろん、シェルがサポートしている場合プロセスの交換

答え2

これがあなたにとって良いと思われる場合は、パイプを使用してこれを行う方法に関する提案があります。

「badtool」の入出力ファイルはパイプである可能性があるとします。

mkfifo IF
mkfifo OF

# one therminal
tool | tool2 |... tooln > IF

# second terminal
bad_tool IF OF

#third terminal
tooln+1 < OF | tool n+2 | tool n+3 ...

スクリプトを生成するには、次の部分を関数でラップできます。

function A(){ ... }
function B(){ ... }
function C(){ ... }
# and run in background in parallel
A&
B&
C&

IFすべての画像(パイプラインと「再利用可能」)を処理しOF続け、ジョブ全体が完了したら削除します。

rm IF OF

答え3

Linuxだったらこんなことができたでしょう。

bad_tool /dev/stdin /dev/stdout

/dev/stdinそして(それぞれ)シンボリックリンク/dev/stdoutのみがあります。/proc/self/fd/{0,1}

関連情報