組み込みのcdとcdコマンドの違いは何ですか?

組み込みのcdとcdコマンドの違いは何ですか?

私はLinuxコマンドを見つけましたbuiltin cd

コマンドbuiltin cdとの違いは何ですかcd

実際、この違いについていくつかの調査を行いましたが、それについて意味のある意味のある説明が見つかりませんでした。

答え1

この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そしてディレクトリの変更(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

答え2

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

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

場合によってははいたとえばcdbuiltin cdいいえただそう呼んでください。 使用は、builtin cdユーザーがシェル関数またはエイリアスを介して追加できるオーバーロード機能をバイパスします。

例:

組み込みコマンドは、cdヒントを更新する関数によってオーバーロードされる可能性があります。

cd() {
    builtin cd "$@" && PS1=$(__update_prompt)
}

その中には、__update_prompt文字列を出力する他のユーザー提供の関数もあります。

関数はbuiltin cd再帰的に呼び出されません。関数がアクティブなシェルで使用されると、builtin cd関数は呼び出されません。


1外部コマンドを持つ Unices がありますcd(macOS、そして私は Solaris を信じます)。このコマンドの目的はできないcdシェルの作業ディレクトリの変更は、使用可能な外部ユーティリティの1つを一覧表示するPOSIX標準を満たすために実行できます(cd「特殊組み込みユーティリティ」の1つではありません)。また、作業ディレクトリが指定されたディレクトリに変更されたことを確認するテストとしても機能します。可能でしょう

関連情報