Linuxコマンドbuiltin cd
。
コマンドの違いは何ですかbuiltin cd
およびcd
?
実際、私は違いについていくつかの調査を行いましたが、これについて注目すべき重要な説明は見つかりませんでした。
cd
コマンドは組み込みなので、通常はbuiltin cd
はcd
と同じことを行います。ただし、cd
が関数またはエイリアスとして再定義される場合は違いがあります。その場合、cd
は関数/エイリアスを呼び出しますが、builtin cd
は引き続きディレクトリを変更します(つまり、関数によって破壊された場合でも、ビルトインにアクセスできます)。
例えば:
user:~$ cd () { echo "I won't let you change directories"; }
user:~$ cd mysubdir
I won't let you change directories
user:~$ builtin cd mysubdir
user:~/mysubdir$ unset -f cd # undefine function
またはエイリアスを使って:
user:~$ alias cd='echo Trying to cd to'
user:~$ cd mysubdir
Trying to cd to mysubdir
user:~$ builtin cd mysubdir
user:~/mysubdir$ unalias cd # undefine alias
builtin
を使用することも、何かを行うcd
関数を定義する良い方法ですandディレクトリを変更します(cd
を呼び出すと、無限の再帰で再び関数。)
例えば:
user:~ $ cd () { echo "Changing directory to ${1-home}"; builtin cd "$@"; }
user:~ $ cd mysubdir
Changing directory to mysubdir
user:~/mysubdir $ cd
Changing directory to home
user:~ $ unset -f cd # undefine function
ほとんどの場合、違いはありません(以下を参照)。 cd
コマンドは、すべてのシェルに組み込まれているコマンドです。内蔵する必要があります1 外部コマンドは呼び出し側のシェルの環境を変更できないため、作業ディレクトリを変更すると、その環境が変更されます。
bash
コマンドbuiltin
は、同じ名前のシェル関数、エイリアス、または外部コマンドが使用できる場合でも、シェルにコマンドの組み込みバージョンを使用するように強制します。
ある場合is例: cd
という名前のシェル関数、次にbuiltin cd
はnotを呼び出します。 builtin cd
を使用すると、ユーザーがShell関数またはエイリアスを介して追加した可能性のあるオーバーロードされた機能がバイパスされます。
例:
cd
組み込みコマンドは、プロンプトを更新する関数によってオーバーロードされる場合があります。
cd() {
builtin cd "$@" && PS1=$(__update_Prompt)
}
ここで、__update_Prompt
は、文字列を出力する他のユーザー提供の関数です。
関数のbuiltin cd
は、関数を再帰的に呼び出しません。この関数がアクティブなシェルでbuiltin cd
を使用しても、関数は呼び出されません。
1外部のcd
コマンド(macOS、そして私はSolaris)を備えたUnicesがあります。 できないシェルの作業ディレクトリを変更するそのコマンドの目的は、POSIX標準を満たすことであり、cd
を外部ユーティリティの1つとしてリストする必要があります。利用可能(cd
は「特別な組み込みユーティリティ」の1つではありません)。また、作業ディレクトリを特定のディレクトリに変更するかどうかを確認するためのテストとしても機能します可能性があります。