Я столкнулся с командой 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
- некоторая другая пользовательская функция, которая выводит строку.
Функция builtin cd
in не будет вызывать функцию рекурсивно. Использование builtin cd
в оболочке, где эта функция активна, дополнительно не вызовет функцию.
1 Есть Unices с внешней cd
командой (macOS, и, я полагаю, Solaris). Цель этой команды, которая не может изменить рабочий каталог для оболочки, возможно, состоит в том, чтобы удовлетворить стандарт POSIX, который перечисляет в cd
качестве одной из внешних утилит, которые должны быть доступны ( cd
не является одной из «специальных встроенных утилит») , Он может также служить в качестве теста , чтобы увидеть ли изменения каталога работы в данной директории будет возможно .
cd
командой.