Яка різниця між вбудованими командами CD та CD?


17

Я зустрів команду Linux, builtin cd.

Яка різниця між командами builtin cdта cd?

Насправді я провів деякі дослідження щодо різниці, але не зміг знайти знаменного та вагомого пояснення з цього приводу.


1
Дивіться також unix.stackexchange.com/q/38808/117549
Jeff Schaller

Дивіться також: stackoverflow.com/q/15691977/974555
Герріт

Відповіді:


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 Приклади тут особливо показові.
Ташус

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є якась інша функція, що надається користувачем, яка виводить рядок.

The builtin cdУ функції не викликатиме функцію рекурсивно. Використання builtin cdв оболонці, де ця функція активна, додатково не викликає функцію.


1 Є Unices із зовнішньою cdкомандою (macOS і, я вважаю, Solaris). Мета цієї команди, яка не може змінити робочий каталог для оболонки, можливо, задовольнити стандарт POSIX, який перераховує cdяк одну із зовнішніх утиліт, які повинні бути доступними ( cdне є однією із "спеціальних вбудованих утиліт") . Це може також послужити тестом, щоб зрозуміти, чи можлива зміна робочого каталогу в заданому каталозі .


FWIW, MacOS також потрапляв би до категорії ОС із зовнішньою cdкомандою.
Іоанн

@yoann Дійсно так і є.
Kusalananda

Дякую - ви провели мій день із найвищим рівнем, добре вивченим, «виносом педантизму».
Джеймс

більшість оболонок - це зовнішня програма для execlineb, але тоді CD буде виконувати інші аргументи
Grump
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.