Я зустрів команду 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командою.