
cd
なぜプログラムではないのかは常に疑問に思っていましたが、答えが見つかりませんでした。
なぜこれが起こるのか知っている人がいますか?
答え1
このcd
コマンドは、「現在の作業ディレクトリ」を変更します。そうですか?
「現在の作業ディレクトリ」は、各プロセスの固有の属性です。
したがって、cd
プログラムであれば、次のように動作します。
cd foo
- プロセスが
cd
始まります - この
cd
プロセスはディレクトリを変更しますCDプロセスの場合 - プロセス
cd
終了 - シェルは、現在の作業ディレクトリを含む、開始する前とまだ同じ状態を持ちます。
答え2
cd
内蔵シェルだけでなく、実はこれもプログラムです。POSIX準拠のオペレーティングシステムで。それら〜しなければならない汎用ユーティリティ用のスタンドアロン実行可能ファイルを提供します。cd
たとえば、この場合は次のようになります。ソラリス、X、HP-UX、オペレーティングシステム。
明らかに、組み込み機能は、cd
外部実装が現在のシェルディレクトリを変更しないため、依然として必須です。しかし、後者はまだ有用です。次の例は、POSIXがcd
このコマンドを使用してどのように想定するかを示しています。
find . -type d -exec cd {} \;
POSIXシステムでは、このオネライナはcd
入力が許可されていないディレクトリに関するエラーメッセージを報告します。ほとんどのGnu / Linuxディストリビューションは、次のエラーメッセージで失敗します。
find: `cd': No such file or directory
これがあなたの質問に対する答えです。」CDはなぜプログラムではないのですか?「最初のUnix共著者の一人が書いたものです。初期のUnix実装では、(cd
当時の表記のように)外部プログラムが最初に実装された後、予期せず動作を停止しました。chdir
fork
引用するデニス・リッチ:
喜んで走っていたときにchdir(現在のディレクトリ変更)コマンドが動作を停止したことがわかりました。多くのコードを読んでフォークを追加すると、chdir呼び出しがどのように中断されるのか心配していました。ついに真実が明らかになった。 chdirは以前のシステムでは一般的なコマンドでした。端末に接続されている(唯一の)プロセスの現在のディレクトリを調整します。新しいシステムでは、chdirコマンドはそれを実行するために作成されたプロセスの現在のディレクトリを正しく変更しますが、プロセスは親シェルに影響を与えずにすぐに終了します。シェル内で実行するには、chdirを特別なコマンドで作成する必要があります。いくつかのコマンド類似関数には、ログインなどの同じ属性があることがわかりました。
源泉:デニスM.リッチ、」Unix時分割システムの進化"、AT&T Bell Laboratories Technical Magazine 63(6)、パート2、1984年10月、1577-93ページ
Unixバージョン1(1971年3月)chdirマニュアルページ状態:
各コマンドは実行する新しいプロセスを生成するため、chdir が通常のコマンドで作成された場合、chdir は無効です。したがって、シェルによって認識され実行されます。
答え3
Bashについて(シェルとは何ですか?):
シェルはまた、別のユーティリティを介して取得できない機能や便利ではない機能を有効にする小さな組み込みコマンドセット(組み込み)も提供します。たとえば、、、
cd
)はシェル自体で直接動作するため、シェルの外部で実装することはできません。 、、組み込みコマンドなどは別のユーティリティで実装することもできますが、組み込みコマンドとして使用する方が便利です。すべてのシェル組み込み関数は、以降のセクションで説明します。break
continue
exec
history
getopts
kill
pwd
答え4
cd
Unixには、他のプロセス(または親プロセス)の現在の作業ディレクトリを変更するメカニズムがないため、シェルのコマンドは別のプロセスにすることはできません。
cd
他のプロセスでは、親プロセス(シェル)の現在の作業ディレクトリを変更する必要があります。これはUnixでは不可能です。代わりにcd
特殊な組み込みコマンドです。シェルは現在の作業ディレクトリを変更するために、および同じchdir()
機能を呼び出します。fchdir()
注:カーネルは各プロセスの現在の作業ディレクトリのinode番号を格納します。子プロセスはcwd
親プロセスからそれを継承します。