6

私の質問は、cd がパイプの先頭または途中にあるときに、なぜ cd が bash のように動作するのかということです。

私がcdを与えるとき | ls、それでも親ディレクトリ内のファイルを出力しますが、基本的には cd コマンドを無視します。

csh でこのように実装されていないのはなぜですか 。ls の場合、ホーム ディレクトリに cd し、そのディレクトリに ls を適用する必要があります。制御がシェルに戻ったときに、シェルが実行されている pwd の古い値を保持する必要があります。つまり、パイプライン内の cd は、cd コマンドの右側にあるすべてのコマンドに対して、変更されたディレクトリを使用する必要があります。

ここで基本的な設計原則が欠けていますか?

4

2 に答える 2

7

あなたは確かに基本的な設計原則を欠いています。

一般に、プロセスを開始すると、すべての環境変数と現在の作業ディレクトリを含む独自の「環境」があります。プロセスが行う変更は、そのプロセスとその子に限定されます。プロセスが兄弟、さらに悪いことに、両親に影響を与える可能性がある場合に生じる可能性のある混乱を想像してみてください。

パイプラインがある場合、親、パイプラインを指定したシェル、およびすべて一緒に「パイプ」された多数の子があり、各子には独立した環境があります。

これを理解すれば、物事を回避して親のディレクトリを変更するのは非常に簡単です。

  (cd /etc && ( ls | grep x))

ここではすべてが () 内にあり、子プロセスで実行されるため、cd は現在のシェルには影響しませんが、(孫の) 子プロセスで実行されているパイプラインには影響します。

于 2013-10-15T05:58:14.007 に答える
2

それはパイプの目的ではないからです。それらは、シェルの状態を制御するのではなく、入出力を指示するためのものです。

説明している動作が必要な場合は、サブシェルを使用します。

( cd ; ls )
于 2013-10-15T05:47:16.227 に答える