引用したようにこれは素晴らしい答えですcd
、POSIXシステムには組み込みシェルに加えて外部バイナリがあります。 OS X 10.8では、独自の作業ディレクトリを変更した直後に終了するため、組み込み/usr/bin/cd
プログラムのように使用することはできません。cd
その目的は何ですか?
答え1
これは、主にPOSIXツールボックスをシェルの内側と外側の両方で使用できるようにするために使用されます。POSIXでこれを求める理由)。
これはcd
あまり役に立ちませんが、cd
ディレクトリを変更すると他の副作用があることに注意してください。ディレクトリにchdir()
アクセスできるかどうかを判断するのに役立つ終了ステータスを返し、ディレクトリにアクセスできない理由を説明する便利なエラーメッセージを出力しますchdir()
。できない時。
例:
dirs_i_am_able_to_cd_into=$(find . -type d -exec cd {} \; -print)
別の潜在的な副作用はディレクトリの自動マウントです。
一部のシステムでは、標準シェル組み込みのほとんどの外部コマンドが同じスクリプトへのシンボリックリンクとして実装されています。
#! /bin/sh -
"${0##*/}" "$@"
これはシェルを起動し、その中に組み込まれたコマンドを実行することです。
他のシステム(GNUなど)はユーティリティを実際の実行可能なコマンドとして扱うため、動作がシェルの組み込みバージョンと異なる場合に混乱を招く可能性があります。
答え2
組み込まれていないcdコマンドを使用できるという事実は、本質的にPOSIXによるものです。必要すべての一般的な組み込みコマンドは、env
execの一連のコマンドである、、、およびを介して組み合わせることができます。find
nice
nohup
time
xargs
しかし、これらのコマンドと組み合わせることは意味がないので、これはcd
意味がありません。しかし、多少防御可能な例は次のとおりです。
find . -type d -exec cd {} \;
env HOME=/foo cd
答え3
パスがアクセス可能なディレクトリに対応していることを確認することに加えて、cd
実行可能ファイルはCDPATH
変数を処理して使用します。印刷する正常に使用された場合に確認されたディレクトリの絶対パス。
$ export CDPATH=/usr
$ echo bin lib | xargs -n 1 cd
/usr/bin
/usr/lib
これは時々便利ですが、一致するディレクトリを検索するために使用されるのと同じロジックを再実装する必要はありません。特定のユースケースは、可能な複数の親ディレクトリの下で特定の名前の最初の既存のディレクトリを見つけることです。
cd
また、処理されますが、OLDPWD
環境cd -
変数はすでに使用可能であるため、これはあまり具体的には便利です。