私は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
同じ名前のシェル関数、エイリアス、または外部コマンドがあっても、シェルにコマンドの組み込みバージョンを使用するように強制します。
場合によってははいたとえばcd
、builtin 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つではありません)。また、作業ディレクトリが指定されたディレクトリに変更されたことを確認するテストとしても機能します。可能でしょう。