cd
シェル組み込みであることに加えて、実際には POSIX準拠OS上のプログラムでもあります。のような通常のユーティリティ用に独立した実行可能ファイルを提供する必要がありますcd
。これは、たとえば、Solaris、AIX、HP-UX、およびOS Xの場合です。
明らかに、cd
外部実装は現在のシェルディレクトリを変更しないため、ビルトインは依然として必須です。ただし、後者は依然として有用です。POSIXがこのcd
コマンドの使用方法をどのように想定しているかを示す例を次に示します。
find . -type d -exec cd {} \;
POSIXシステムでは、このonelinerは、許可さcd
れていないすべてのディレクトリについてエラーメッセージを報告します。ほとんどのGnu / Linuxディストリビューションでは、次のエラーメッセージで失敗します。
find: `cd': No such file or directory
また、元のUnixの共著者の1人による「cdがプログラムではないのはなぜですか」という質問に対する答えがあります。非常に初期のUnix実装では、cd
(chdir
当時綴られていた)外部プログラムでした。fork
最初に実装された後、予期せず動作しなくなりました。
デニス・リッチーの引用:
歓喜の最中に、chdir(現在のディレクトリを変更)コマンドが機能しなくなったことが発見されました。コードの読み取りが多くあり、フォークの追加によってchdir呼び出しがどのように破損する可能性があるかについての内省が心配でした。最後に真実が明らかになりました。古いシステムでは、chdirは普通のコマンドでした。端末に接続された(一意の)プロセスの現在のディレクトリを調整しました。新しいシステムでは、chdirコマンドは実行するために作成されたプロセスの現在のディレクトリを正しく変更しましたが、このプロセスは即座に終了し、親シェルにはまったく影響しませんでした!chdirをシェル内で内部的に実行される特別なコマンドにする必要がありました。いくつかのコマンドのような関数には、ログインなどの同じプロパティがあります。
出典: Dennis M. Ritchie、「Unixタイムシェアリングシステムの進化」、AT&T Bell Laboratories Technical Journal 63(6)、Part 2、1984年10月、pp.1577–93
Unixバージョン1(1971年3月)chdirのマニュアルページの状態:
各コマンドを実行するための新しいプロセスが作成されるため、通常のコマンドとして作成された場合、chdirは無効になります。したがって、シェルによって認識および実行されます。