複数のファイルの内容をスクリプトの標準入力に供給するための略記


20

たとえば、スクリーンからいくつかの結果をscript読み取りstdin、画面に出力するというスクリプトがあります。

1つのファイルのコンテンツをフィードしたい場合は、次のように入力します。

$ ./script < file1.txt

しかし、複数のファイルの内容を同じ方法でスクリプトにフィードしたい場合、どうしても可能ですか?これまでに思いついた最高のものは:

cat file1.txt file2.txt > combined.txt && ./script < combined.txt

2つのコマンドを使用して、一時ファイルを作成します。同じことを行う方法はありますが、結合ファイルの作成をバイパスする方法はありますか?


に切り替えるとzsh、実行できるようになりますcmd <file1 <file2 ... <fileN;)
don_crissti

回答:


20

あなたはcatパイプを使うことができます:

cat file1 file2 file3 ... fileN | ./script

パイプを使用し、一時ファイルを使用しない例:

join file1.txt file2.txt | ./script

ああ とても単純なので、自分でどうやってそれを実現しなかったのかさえわかりません。ありがとう!
0x4B1D

10
猫賞の便利な使い方!
グレンジャックマン

4
@Bruce Ediger:join一時ファイルなしで使用する方法を指摘しているだけで、読者にわかりやすくするために: cat f1 f2join f1 f2
Peter.O

@fredはこれを指摘してくれて感謝します- join以前使っていたので、この例で使用しました。実際には、私の例ではを使用していましたcat
-0x4B1D

10

パイプを使用したくない場合は、プロセス置換で入力リダイレクトを使用できます。

./script <(cat file1 file2)

3

@Jonah Braunの答えを追加するために、スクリプトにプロセス出力も追加する必要がある場合、つまり、ファイルがディスク上にないが、URL使用curlまたは同様のツールを介してアクセスされる場合があります。

このようなものを使用してstdout複数のプロセスを取得し、スクリプトでそれらを使用することができますstdin

これは、multi-input.sh次の入力内容を処理するスクリプトになります。

#!/usr/bin/env bash
while read line; do
    echo $line
done

今それをテストします:

$ ./multi-input.sh < <(cat <(echo process 1) <(echo process 2) <(echo process 3))

出力:

process 1
process 2
process 3

<()必要に応じてプロセスを仮想化にfile使用fdするため、それ<を読む必要があります。cat仮想または実ファイルを連結し、ファイルを連結するため、それ自体は必要ありません。

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