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


17

Linuxコマンドに遭遇しましたbuiltin cd

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

実際、私は違いについていくつかの研究をしましたが、これについて注目すべき重要な説明を見つけることができませんでした。



回答:


41

この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

5
+1ここでは、例が特に例示されています。
Tashus

2
エイリアスの場合、との間に違いはbuiltin cd mysubdirあり\cd mysubdirますか?
ゲリット

2
@gerritという名前の関数がある場合のみ。cdその場合\cd、エイリアスをバイパスして関数を実行します。stackoverflow.com/a/16506263/4518341
wjandrea

15

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

このbashコマンドbuiltinは、シェル関数、エイリアス、または同じ名前で利用可能な外部コマンドがある場合でも、シェルにコマンドの組み込みバージョンを強制的に使用させます。

そこの場合された名前のシェル関数を例えばcd、その後builtin cdではないことを呼び出します。 使用builtin cdすると、ユーザーがシェル関数またはエイリアスを介して追加した可能性のあるオーバーロードされた機能がバイパスされます。

例:

cd組み込みコマンドプロンプトを更新機能により、過負荷状態にすることができます。

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

どこに__update_prompt文字列を出力する他のユーザー提供の関数があります。

builtin cd機能では、再帰関数を呼び出すことはありません。builtin cdこの関数がアクティブなシェルで使用すると、さらに関数を呼び出さないでしょう。


1外部cdコマンド(macOS、および私は信じる、Solaris)を持つUnicesがあります。シェルの作業ディレクトリを変更できないこのコマンドの目的は、POSIX標準を満たすcdことです。これは、利用可能な外部ユーティリティの1つとしてリストされています(cd「特別な組み込みユーティリティ」の1つではありません) 。また、特定のディレクトリへの作業ディレクトリの変更が可能かどうかを確認するテストとして機能する場合もあります


FWIW、MacOSも外部cdコマンドを使用してOSのカテゴリに分類されます。
yoann

@yoann確かにそうです。
クサラナンダ

ありがとう-よく研究されたフットノットのペダリーで最高の一日を過ごしました。
ジェームズ

ほとんどのシェル-execlinebの外部プログラムですが、その後、cdが残りの引数を実行します
Grump
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.