I napotkał polecenie Linux builtin cd
.
Jaka jest różnica między poleceniami builtin cd
a cd
?
W rzeczywistości przeprowadziłem kilka badań dotyczących różnicy, ale nie mogłem znaleźć niezwykłego i znaczącego wyjaśnienia na ten temat.
I napotkał polecenie Linux builtin cd
.
Jaka jest różnica między poleceniami builtin cd
a cd
?
W rzeczywistości przeprowadziłem kilka badań dotyczących różnicy, ale nie mogłem znaleźć niezwykłego i znaczącego wyjaśnienia na ten temat.
Odpowiedzi:
cd
Komenda jest wbudowany, więc zazwyczaj builtin cd
zrobi to samo co cd
. Istnieje jednak różnica, jeśli cd
zostanie ona ponownie zdefiniowana jako funkcja lub alias, w którym to przypadku cd
wywoła funkcję / alias, ale builtin cd
nadal zmieni katalog (innymi słowy, zachowa dostęp do wbudowanej funkcji, nawet jeśli zostanie zablokowana przez funkcję).
Na przykład:
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
Lub z aliasem:
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
Użycie builtin
jest również dobrym sposobem na zdefiniowanie cd
funkcji, która coś robi i zmienia katalog (ponieważ wywołanie cd
z niej po prostu wywoływałoby funkcję ponownie w nieskończonej rekurencji).
Na przykład:
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
builtin cd mysubdir
i \cd mysubdir
?
cd
, w takim przypadku pominie \cd
alias i uruchomi funkcję. Zobacz stackoverflow.com/a/16506263/4518341
W większości przypadków nie ma różnicy (ale patrz poniżej). cd
Polecenie jest wbudowane polecenie we wszystkich muszli. Musi być wbudowany 1, ponieważ zewnętrzne polecenie nie może zmienić środowiska powłoki wywołującej, a zmiana katalogu roboczego stanowi zmianę w jego środowisku.
Na bash
polecenie builtin
siły powłoka użyć wbudowanego w wersji polecenia, choć może istnieć funkcja powłoki, alias lub komenda zewnętrzna dostępna z tej samej nazwie.
W przypadku tam gdzie jest np funkcję powłoki z nazwą cd
, to builtin cd
byłoby nie nazwać. Użycie builtin cd
pomija wszelkie przeciążone funkcje, które użytkownik mógł dodać za pomocą funkcji powłoki lub aliasu.
Przykład:
cd
Wbudowanego polecenia mogą być przeciążone przez funkcję, która zaktualizuje komunikat:
cd() {
builtin cd "$@" && PS1=$(__update_prompt)
}
gdzie __update_prompt
jest inna funkcja dostarczona przez użytkownika, która generuje ciąg znaków.
Funkcja builtin cd
in nie wywołałaby funkcji rekurencyjnie. Użycie builtin cd
w powłoce, w której ta funkcja jest aktywna, dodatkowo nie wywołałoby tej funkcji.
1 Są Unices z zewnętrznym cd
poleceniem (macOS i, jak sądzę, Solaris). Celem tego polecenia, które nie może zmienić katalogu roboczego powłoki, jest prawdopodobnie spełnienie standardu POSIX, który wymienia cd
jako jedno z zewnętrznych narzędzi, które powinny być dostępne ( cd
nie jest to jeden z „specjalnych wbudowanych narzędzi”) . Może również służyć jako test sprawdzający, czy możliwa jest zmiana katalogu roboczego na dany katalog .
cd
poleceniem.