
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