次の一連のコマンドがあります。
cd / && ls | ( cd /tmp && cat >dumpfile)
この一連のコマンドは次のことを行います。/tmp/dumpfile
という名前のファイルを作成します。このファイルには、ルートディレクトリのリストが含まれています。
cd / && ls
出力はサブシェルにパイプされます。私が見つけたのはoddサブシェルで、cd /tmp
がls
出力を飲み込む代わりに、後のcat >dumpfile
がそれを取得してファイルに書き込むということです。ここで何が起こっているのですか?
パイプは、ls
からサブシェルに移動するようにstdoutを設定します。
サブシェルでは、cd /tmp
とcat
は同じプロセスで実行されます。
cd /tmp
はstdin(パイプ)から読み取らないため、cat
がstdinから読み取ると、ls
のすべての出力を取得します。
cd
は、出力を飲みたくないので飲み込みません。このことを考慮:
{ ls; date; } | (cd /tmp && date >> date.txt && cat date.txt && cat >dumpfile)
最後のcat >dumpfile
だけが、パイプからのstdin
を保存します。これは、他のどのコマンドもそれを消費したくないためです。