Was ist der Unterschied zwischen den in cd und cd eingebauten Befehlen?

17

Ich bin auf einen Linux - Befehl gestoßen builtin cd.

Was ist der Unterschied zwischen den Befehlen builtin cdund cd?

Tatsächlich habe ich einige Nachforschungen über den Unterschied angestellt, aber ich konnte keine bemerkenswerte und signifikante Erklärung dafür finden.

Goktug
quelle
1
Siehe auch unix.stackexchange.com/q/38808/117549
Jeff Schaller

Antworten:

41

Der cdBefehl ist ein eingebauter Befehl, der normalerweise builtin cddas Gleiche tut wie cd. Es gibt jedoch einen Unterschied, ob cdals Funktion oder als Alias ​​neu definiert wird. In diesem Fall cdwird die Funktion / der Alias ​​aufgerufen builtin cd, das Verzeichnis wird jedoch weiterhin geändert.

Beispielsweise:

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

Oder mit einem Alias:

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

Das Verwenden von builtinist auch eine gute Möglichkeit, eine cdFunktion zu definieren , die etwas ausführt und das Verzeichnis ändert (da ein Aufruf cdvon ihr die Funktion in einer endlosen Rekursion immer wieder aufrufen würde).

Beispielsweise:

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
filbranden
quelle
5
+1 Die Beispiele sind hier besonders veranschaulichend.
Tashus
2
Gibt es bei einem Alias ​​einen Unterschied zwischen builtin cd mysubdirund \cd mysubdir?
Gerrit
2
@gerrit Nur wenn eine Funktion mit dem Namen vorhanden ist cd, wird in diesem Fall \cdder Alias ​​umgangen und die Funktion ausgeführt. Siehe stackoverflow.com/a/16506263/4518341
wjandrea
15

In den meisten Fällen gibt es keinen Unterschied (siehe unten). Der cdBefehl ist in allen Shells integriert. Es muss 1 integriert sein, da ein externer Befehl die Umgebung der aufrufenden Shell nicht ändern kann und das Ändern des Arbeitsverzeichnisses eine Änderung in ihrer Umgebung darstellt.

Der bashBefehl builtinerzwingt, dass die Shell die integrierte Version eines Befehls verwendet, obwohl möglicherweise eine Shell-Funktion, ein Alias ​​oder ein externer Befehl mit demselben Namen verfügbar sind.

In dem Fall , in dem es wird eine Shell - Funktion mit dem Namen zB cd, dann builtin cdwürde nicht so nennen. Durch builtin cddie Verwendung von Bypasses werden überladene Funktionen umgangen, die der Benutzer möglicherweise über eine Shell-Funktion oder einen Alias ​​hinzugefügt hat.

Beispiel:

Der cdeingebaute Befehl kann durch eine Funktion überladen werden, die die Eingabeaufforderung aktualisiert:

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

Wobei __update_promptes sich um eine andere vom Benutzer bereitgestellte Funktion handelt, die eine Zeichenfolge ausgibt.

Die builtin cdin der Funktion würde die Funktion nicht rekursiv aufrufen. Die Verwendung builtin cdin einer Shell, in der diese Funktion aktiv ist, würde die Funktion zusätzlich nicht aufrufen.


1 Es gibt Unices mit externem cdBefehl (macOS und, glaube ich, Solaris). Der Zweck dieses Befehls, der das Arbeitsverzeichnis für eine Shell nicht ändern kann , besteht möglicherweise darin, den POSIX-Standard zu erfüllen, der cdals eines der externen Dienstprogramme aufgeführt ist, die verfügbar sein sollten (es cdhandelt sich nicht um eines der "speziell eingebauten Dienstprogramme"). . Es kann auch als Test dienen, um festzustellen, ob das Ändern des Arbeitsverzeichnisses in ein bestimmtes Verzeichnis möglich ist .

Kusalananda
quelle
FWIW, MacOS würde auch mit einem externen cdBefehl in die Kategorie der Betriebssysteme fallen .
Yoann
@yoann Tatsächlich.
Kusalananda
Vielen Dank - Sie haben meinen Tag mit erstklassiger, gut recherchierter, fußnotierter Pedanterie verbracht.
James
Die meisten Shells - es ist ein externes Programm für execlineb, aber dann wird seine CD die verbleibenden Argumente
ausführen