ファイル名を期待するコマンドにパイプを渡します


19

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

これを実現する方法はありますか?私の手品のなにも何もしないようです。

fooこの場合、PHPスクリプトは、ファイルを順番に処理すると信じています)。

UbuntuとBashを使用しています

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

pv longfile.txt | foo /dev/stdin

今私はそれを見ることが非常に明白です。


ワンライナーをお探しですか?
デイブフォーガック

fooは、stdinから読み取るために「-」の引数を受け入れないのですか?
rackandboneman

残念ながら、この場合-それはphpスクリプトです。
スティーブベネット

はい、実際に。。
スティーブベネット

回答:


19

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

foo <(somecommand | pv)

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

somecommand | pv | foo /dev/stdin

1
ああ、いいね!これpv inputfile.txt | foo /dev/stdinはまさに私が探していたものですが、考えていませんでした。
スティーブベネット

すごい!/ dev / stdin
セージ

<(.)私のために働いた。この構文はBashマニュアルに文書化されていますか?(.)コマンド置換が文書化されていることは理解していますが、<説明との組み合わせは見ていません。
flow2k

@ flow2k「プロセス置換」と呼ばれます。bash マニュアルのセクション3.5.6を参照してください。
ゴードンデイヴィソン

とった。あなたは正しい-それは名前付きパイプ/を使用することを述べていますmkfifo
flow2k


2

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

Shell Script mktemp、一時的な名前付きパイプを作成する最良の方法は何ですか?

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

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

その後、次のようにしてパイプを見ることができます。

foo $tmppipe

それが終わったら削除してください。


1

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

mkfifo file_read_by_foo; pv ... > file_read_by_foo 

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.