コマンドの出力には任意のデータがあります(たとえば、出力のバイナリデータスライスを使用tail
)。ファイルを引数(例:)rawtopng [filein] [fileout]
としてのみ受け入れ、ダッシュ(-
)引数をサポートしておらず、それらの間に一時ファイルを作成できない他のコマンド/プログラムにこのファイルを提供したいと思います。 Bashでどうすればいいですか?
rawtopng <(tail myfile) fileout
仕事のようなこともしますか?
答え1
プロセス置換はrawtopng <(tail myfile) fileout
パイプ(と同様tail myfile | rawtopng - fileout
)を生成し、パイプ名をプログラムに渡します。 Linuxではrawtopng
同様の名前が表示され、/dev/fd/42
ファイル形式を照会するとパイプというメッセージが表示されます。ファイルシステムに書き込む必要はありません(これは名前付きパイプではなく匿名パイプです)。次のコマンドを実行して、何が起こっているのかを確認できます。ls -ld <(echo foo)
これはうまくいくでしょうか?コマンドに必要な内容によって異なりますrawtopng
(わかりません。コマンドに慣れていません)。ファイルから読むことがすべてあれば大丈夫です。ファイルを見つける必要がある場合(つまり、入力を最初から最後まで線形に読み取らない場合)、または操作を開始する前に入力のサイズを知る必要がある場合は機能しません。この場合、一時ファイルが必要です。
コマンドに検索可能な入力またはサイズが既知の入力が必要な場合は、選択肢がなく、一時ファイルを作成する必要があります。ディスクに書き込まないtmpfs
場合は、Unixバリアントがその機能を提供している場合(Linuxでは)、ファイルシステムにファイルを保存するように調整できます。mktemp
次のコマンドを使用して一時ファイルを作成できます。
tmp=$(TMPDIR=/tmp mktemp XXXXXXXXXXXX.raw)
rawtopng "$tmp" fileout
rm "$tmp"
zsh では、プロセス置換バリアントはrawtopng =(tail myfile) fileout
一時ファイルを生成し、コマンドの完了後に削除します。
プロセスの置き換えが解決できないもう1つの状況は、プログラムが特定の拡張子を持つファイルを使用する必要がある場合です。この場合、名前付きパイプを作成すると役に立ちます。
mkfifo /tmp/foo.raw
tail myfile >/tmp/foo.raw &
rawtopng /tmp/foo.raw fileout
rm /tmp/foo.raw
答え2
私はあなたが正しい道を行っていると思います!<(tail myfile)
匿名の名前付きパイプを生成し、Bash型です。プロセスの交換。
/dev/fd/XX
通常、これは実行中のプロセスのファイル記述子インタフェース「filename」に渡されます。
リンクされた文書の例:
bash$ wc <(cat /usr/share/dict/linux.words)
483523 483523 4992010 /dev/fd/63
プロセスから読み取るにはを使用し<(command)
、プロセスに書き込むにはを使用します>(command)
。
プロセスの置き換えについて詳しく学ぶことができます。ウィキペディアでしかも。
答え3
名前付きパイプを作成できます。
mkfifo input
パイプラインの作成などの操作を実行します。
出力を読みたいプログラムを起動し、出力をパイプ(つまりパイプ)にリダイレクトします。myprog > input
次に、入力をファイルとして使用して別のコマンドを実行します。
パイプは一方向です。プログラムは読めますが、書くことはできません。