web-dev-qa-db-ja.com

サブシェルおよびcdコマンドと組み合わせたstdin / stdoutの動作

次の一連のコマンドがあります。

cd / && ls | ( cd /tmp && cat >dumpfile)

この一連のコマンドは次のことを行います。/tmp/dumpfileという名前のファイルを作成します。このファイルには、ルートディレクトリのリストが含まれています。

cd / && ls出力はサブシェルにパイプされます。私が見つけたのはoddサブシェルで、cd /tmpls出力を飲み込む代わりに、後のcat >dumpfileがそれを取得してファイルに書き込むということです。ここで何が起こっているのですか?

7
Abdull

パイプは、lsからサブシェルに移動するようにstdoutを設定します。

サブシェルでは、cd /tmpcatは同じプロセスで実行されます。

cd /tmpはstdin(パイプ)から読み取らないため、catがstdinから読み取ると、lsのすべての出力を取得します。

7
Mikel

cdは、出力を飲みたくないので飲み込みません。このことを考慮:

{ ls; date; } | (cd /tmp && date >> date.txt && cat date.txt && cat >dumpfile)

最後のcat >dumpfileだけが、パイプからのstdinを保存します。これは、他のどのコマンドもそれを消費したくないためです。

3
janos