ファイルをパラメータとしてのみ許可するコマンドのデータを別のコマンドに転送する方法は?

ファイルをパラメータとしてのみ許可するコマンドのデータを別のコマンドに転送する方法は?

コマンドの出力には任意のデータがあります(たとえば、出力のバイナリデータスライスを使用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

おすすめ記事