複数のファイルの内容をスクリプトの標準入力に提供する略語です。

複数のファイルの内容をスクリプトの標準入力に提供する略語です。

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

ファイルの内容を提供するには、次のように入力します。

$ ./script < file1.txt

しかし、同じ方法で複数のファイルの内容をスクリプトに供給したい場合、これは可能ですか?これまで私が思いついた最高は次のとおりです。

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

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

答え1

パイプを使用できますcat

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

catこの場合、./script同時に実行されると、データは実際にはパイプやソケットのペアであるいくつかのIPCメカニズムを介してシェルとシステムによって供給されます。

zsh シェルでは、次のこともできます。

./script < file1 < file2 ... < fileN

同じように動作します。 stdin(または他のファイル記述子)が入力を複数回リダイレクトする場合、zshはそれをパイプの読み取り端に置き換え、内部的に同様のcatプロセスを実装してパイプのもう一方の端を介して順番に入力を提供します。

./scriptファイルを最初に巻き戻したり、メモリにマップした後に何度も読み取る必要がある場合(たとえば、mmap()パイプを使用して実行できないため)、ファイルを表示できると予想される場合、これらの方法は機能しません。またはソケットペアを完了します。この場合、一時的な措置が必要です。定期的な閲覧可能)ファイルであり、両方のコマンド(catおよび./script)を同時に実行することはできません。では、出力を含む一時ファイルへのパスを拡張し、後で自動的に削除するzshプロセス置換形式によって、これが簡単になりました。=(cmd)cmd

./script < =(cat file1 file2 file3 ... fileN)

シェルfishには同様のものがあります。

./script < (cat file1 file2 file3 ... fileN | psub -f)

答え2

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

./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

関連情報