web-dev-qa-db-ja.com

スクリプトの標準入力に複数のファイルのコンテンツをフィードするための省略表現

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

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

$ ./script < file1.txt

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

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

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

21
0x4B1D

catとパイプを使用できます:

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

パイプを使用した一時ファイルなしの例:

join file1.txt file2.txt | ./script
21
Bruce Ediger

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

./script <(cat file1 file2)
10
Jonah Braun

@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自体は、仮想ファイルまたは実ファイルの役割を果たし、ファイルを連結するため、それ自体は必要ありません。

3
sdkks