ファイル名引数を取るコマンドfoo
があるとします:foo myfile.txt
。厄介なことに、foo
は標準入力から読み取りません。実際のファイルの代わりに、別のコマンドの結果を渡したいと思います(実際には、pv
。これはファイルを分類し、副作用として進行状況メーターを出力します)。
これを実現する方法はありますか?トリックのバッグには何もないようです。
(この場合のfoo
はPHPスクリプトであり、ファイルを順次処理すると思います)。
UbuntuとBashを使用しています
編集少し不明瞭な問題の説明で申し訳ありませんが、ここに私が望むことをする答えがあります:
pv longfile.txt | foo /dev/stdin
私がそれを見た今、非常に明白です。
私があなたが適切にしたいことを理解していれば、bashのコマンド置換機能でそれを行うことができます:
foo <(somecommand | pv)
これは、mkfifo
ベースの回答が示唆するものと似ていますが、bashが詳細を処理します(そして、通常の名前付きパイプではなく、/ dev/fd/63のようなものをコマンドに渡します) )。また、次のようにしてそれをさらに直接行うこともできます。
somecommand | pv | foo /dev/stdin
ARRAY=(`pv whatever`); for FILE in $ARRAY; do foo $FILE; done
このUnix SEの質問には、一時的な名前付きパイプを作成する方法を示す回答があります。
シェルスクリプトmktemp、一時的な名前付きパイプを作成する最良の方法は何ですか?
そこでの答えに基づいて、次のようなことができます:
tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
pv examplefile > $tmppipe
その後、次のコマンドでパイプを監視できます。
foo $tmppipe
それが終わったら、それを削除します。
Mkfifoを使用してみてください。
mkfifo file_read_by_foo; pv ... > file_read_by_foo
別のシェルで、foo file_read_by_fooを実行します
xargs
はこれでうまくいくようです:
echo longfile.txt | xargs pv