Я зустрів команду Linux, builtin cd
.
Яка різниця між командами builtin cd
та cd
?
Насправді я провів деякі дослідження щодо різниці, але не зміг знайти знаменного та вагомого пояснення з цього приводу.
Я зустрів команду Linux, builtin cd
.
Яка різниця між командами builtin cd
та cd
?
Насправді я провів деякі дослідження щодо різниці, але не зміг знайти знаменного та вагомого пояснення з цього приводу.
Відповіді:
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
builtin cd mysubdir
і \cd mysubdir
?
cd
в цьому випадку, \cd
вона обійде псевдонім і запустить функцію. Див stackoverflow.com/a/16506263/4518341
У більшості випадків різниці немає (але дивіться нижче). cd
Команда є вбудованої командою у всіх оболонках. Він повинен бути вбудований 1, оскільки зовнішня команда не може змінити середовище викликаючої оболонки, а зміна робочого каталогу являє собою зміну його оточення.
У bash
командному builtin
сили оболонки використовувати вбудовану версію команди, незважаючи на те, що може бути оболонка функції, псевдонім або зовнішня команда доступна з тим же ім'ям.
У випадку, коли є, наприклад, функція оболонки з назвою cd
, тоді builtin cd
це не називатиметься. Використання builtin cd
обходить будь-яку перевантажену функціональність, яку, можливо, додав користувач через функцію оболонки або псевдонім.
Приклад:
cd
Вбудована команда може бути перевантажена функцією , яка оновлює підказку:
cd() {
builtin cd "$@" && PS1=$(__update_prompt)
}
де __update_prompt
є якась інша функція, що надається користувачем, яка виводить рядок.
The builtin cd
У функції не викликатиме функцію рекурсивно. Використання builtin cd
в оболонці, де ця функція активна, додатково не викликає функцію.
1 Є Unices із зовнішньою cd
командою (macOS і, я вважаю, Solaris). Мета цієї команди, яка не може змінити робочий каталог для оболонки, можливо, задовольнити стандарт POSIX, який перераховує cd
як одну із зовнішніх утиліт, які повинні бути доступними ( cd
не є однією із "спеціальних вбудованих утиліт") . Це може також послужити тестом, щоб зрозуміти, чи можлива зміна робочого каталогу в заданому каталозі .
cd
командою.