web-dev-qa-db-ja.com

ビルトインcdとcdコマンドの違いは何ですか?

Linuxコマンドbuiltin cd

コマンドの違いは何ですかbuiltin cdおよびcd

実際、私は違いについていくつかの調査を行いましたが、これについて注目すべき重要な説明は見つかりませんでした。

17
Goktug

cdコマンドは組み込みなので、通常はbuiltin cdcdと同じことを行います。ただし、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
41
filbranden

ほとんどの場合、違いはありません(以下を参照)。 cdコマンドは、すべてのシェルに組み込まれているコマンドです。内蔵する必要があります1 外部コマンドは呼び出し側のシェルの環境を変更できないため、作業ディレクトリを変更すると、その環境が変更されます。

bashコマンドbuiltinは、同じ名前のシェル関数、エイリアス、または外部コマンドが使用できる場合でも、シェルにコマンドの組み込みバージョンを使用するように強制します。

ある場合is例: cdという名前のシェル関数、次にbuiltin cdnotを呼び出します。 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つではありません)。また、作業ディレクトリを特定のディレクトリに変更するかどうかを確認するためのテストとしても機能します可能性があります

15
Kusalananda