Эквивалентны ли функции встроенным командам языка сценариев bash / shell?

Если вы посмотрите на /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 вполне подходит. (Альтернативы могут использоваться не только для двоичных файлов, поэтому вы также найдете там справочные страницы и т. д.)

0
13.04.2019, 17:58
2 ответа

Нет, все команды Unix не являются функциями оболочки, но они могут быть переопределены функцией оболочки.

Имена функций оболочки не ограничиваются именами встроенных -или внешних утилит. Точно так же, как у вас может быть несколько внешних утилит с одинаковым именем по разным путям, у вас также может быть функция оболочки или псевдоним с таким же именем.

Если есть функция с именем fooи внешняя или встроенная -утилита с именем foo, то будет вызвана функция foo.

Чтобы оболочка выбрала встроенную -утилиту, используйте

builtin foo

Чтобы не использовать функцию foo, используйте

command foo

Чтобы гарантировать, что внешняя утилита используется вместо функции оболочки, псевдонима или встроенной -утилиты, используйте полный путь к ней, например.

/bin/echo

Псевдонимы и функции занимают одно и то же пространство имен, поэтому псевдоним и функция не могут иметь одно и то же имя.


Короче:

Команды Unix могут быть

  • псевдонимы или
  • функции оболочки или
  • встроенные в оболочку утилиты или
  • внешние утилиты (скомпилированные двоичные файлы или сценарии, написанные на любом языке сценариев ).

Некоторые «команды» являются не командами, а ключевыми словами, такими как forи ifи т. д. Они также могут быть переопределены псевдонимами и функциями оболочки для получения дополнительных захватывающих возможностей оболочки (, т.е. не делайте этого ). ].

2
28.01.2020, 02:19

Нет. Хотя доступ к встроенным функциям можно получить через то же пространство имен, что и к функциям, они по-прежнему являются отдельными объектами и могут быть доступны, даже если они затенены функцией, с помощью builtinвстроенной команды (для дополнительного удовольствия, вы можете конечно переопределить builtin☺ ). Заметьте также, что если вы unset -f echoу вас будет встроенная функция обратно.

Встроенные функции также, как следует из названия, встроены и реализованы (в случае bash )в коде C, сгенерированном из таких файлов, как echo.def .

3
28.01.2020, 02:19

Теги

Похожие вопросы