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

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

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)

おすすめ記事