Если вы посмотрите на /etc/alternatives
, вы увидите, что он содержит не исполняемые файлы, а больше символических ссылок; например
$ ls -l /etc/alternatives/javac
lrwxrwxrwx 1 root root 43 Sep 20 2016 /etc/alternatives/javac -> /usr/lib/jvm/java-8-openjdk-amd64/bin/javac
Вот как реализуются альтернативы: «двоичный файл» в пути является символической ссылкой на альтернативу в /etc/alternative
, которая сама является символической ссылкой на выбранный целевой двоичный файл. Этот выбор является данными конфигурации, поэтому /etc
вполне подходит. (Альтернативы могут использоваться не только для двоичных файлов, поэтому вы также найдете там справочные страницы и т. д.)
Нет, все команды Unix не являются функциями оболочки, но они могут быть переопределены функцией оболочки.
Имена функций оболочки не ограничиваются именами встроенных -или внешних утилит. Точно так же, как у вас может быть несколько внешних утилит с одинаковым именем по разным путям, у вас также может быть функция оболочки или псевдоним с таким же именем.
Если есть функция с именем foo
и внешняя или встроенная -утилита с именем foo
, то будет вызвана функция foo
.
Чтобы оболочка выбрала встроенную -утилиту, используйте
builtin foo
Чтобы не использовать функцию foo
, используйте
command foo
Чтобы гарантировать, что внешняя утилита используется вместо функции оболочки, псевдонима или встроенной -утилиты, используйте полный путь к ней, например.
/bin/echo
Псевдонимы и функции занимают одно и то же пространство имен, поэтому псевдоним и функция не могут иметь одно и то же имя.
Короче:
Команды Unix могут быть
Некоторые «команды» являются не командами, а ключевыми словами, такими как for
и if
и т. д. Они также могут быть переопределены псевдонимами и функциями оболочки для получения дополнительных захватывающих возможностей оболочки (, т.е. не делайте этого ). ].
Нет. Хотя доступ к встроенным функциям можно получить через то же пространство имен, что и к функциям, они по-прежнему являются отдельными объектами и могут быть доступны, даже если они затенены функцией, с помощью builtin
встроенной команды (для дополнительного удовольствия, вы можете конечно переопределить builtin
☺ ). Заметьте также, что если вы unset -f echo
у вас будет встроенная функция обратно.
Встроенные функции также, как следует из названия, встроены и реализованы (в случае bash )в коде C, сгенерированном из таких файлов, как echo.def .