web-dev-qa-db-ja.com

ファイル名が必要なコマンドにパイプを渡します

ファイル名引数を取るコマンドfooがあるとします:foo myfile.txt。厄介なことに、fooは標準入力から読み取りません。実際のファイルの代わりに、別のコマンドの結果を渡したいと思います(実際には、pv。これはファイルを分類し、副作用として進行状況メーターを出力します)。

これを実現する方法はありますか?トリックのバッグには何もないようです。

(この場合のfooはPHPスクリプトであり、ファイルを順次処理すると思います)。

UbuntuとBashを使用しています

編集少し不明瞭な問題の説明で申し訳ありませんが、ここに私が望むことをする答えがあります:

pv longfile.txt | foo /dev/stdin

私がそれを見た今、非常に明白です。

21
Steve Bennett

私があなたが適切にしたいことを理解していれば、bashのコマンド置換機能でそれを行うことができます:

foo <(somecommand | pv)

これは、mkfifoベースの回答が示唆するものと似ていますが、bashが詳細を処理します(そして、通常の名前付きパイプではなく、/ dev/fd/63のようなものをコマンドに渡します) )。また、次のようにしてそれをさらに直接行うこともできます。

somecommand | pv | foo /dev/stdin
21
Gordon Davisson
ARRAY=(`pv whatever`); for FILE in $ARRAY; do foo $FILE; done
2
Hyppy

このUnix SEの質問には、一時的な名前付きパイプを作成する方法を示す回答があります。

シェルスクリプトmktemp、一時的な名前付きパイプを作成する最良の方法は何ですか?

そこでの答えに基づいて、次のようなことができます:

tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
pv examplefile > $tmppipe

その後、次のコマンドでパイプを監視できます。

foo $tmppipe

それが終わったら、それを削除します。

2
Dave Forgac

Mkfifoを使用してみてください。

mkfifo file_read_by_foo; pv ... > file_read_by_foo 

別のシェルで、foo file_read_by_fooを実行します

1
becomingwisest

xargsはこれでうまくいくようです:

echo longfile.txt | xargs pv
0
MadHatter