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)