Что такое shell builtins и как проверить, является ли команда встроенной

Shell builtins — это команды, которые реализованы прямо внутри интерпретатора командной строки (shell). Они запускаются быстрее, потому что выполняются из оперативной памяти, а не читаются с диска как внешние бинарные файлы. Простая команда cd, меняющая текущую директорию, — классический пример: её состояние влияет на сам процесс оболочки, поэтому она обычно реализована как builtin.
Почему используются встроенные команды
- Быстрее запуск: доступ к памяти быстрее, чем к диску.
- Доступ к состоянию процесса shell: некоторые команды изменяют окружение shell (например, cd, export), поэтому они должны быть встроены.
- Упрощённая интеграция с функциями оболочки: парсинг, подстановка и контроль потоков легче реализовать как часть интерпретатора.
Важно: наличие builtin-команды не мешает существованию внешней утилиты с тем же именем. Если нужно явно запустить внешнюю версию — укажите абсолютный путь.
Как точно определить, является ли команда shell builtin
Используйте несколько надёжных инструментов. Ниже — приоритетный список команд и примеры.
1) type -t
Команда type -t возвращает тип команды в однословном формате.
type -t cdОжидаемый вывод:
builtinЕсли вывод — builtin, значит команда встроенная. Если возвращается file, alias или function — это не встроенная системная утилита.
2) command -v
В bash и некоторых других shell можно выполнить:
command -v cdЕсли команда — builtin, вывод обычно показывает её имя или пометку. Это удобно для быстрого скриптового теста.
3) which и which -a
Команда which покажет путь к внешней программе или пометит, что команда является alias/встроенной в зависимости от реализации which. Замечание: which сама может быть внешней утилитой или алиасом/встроенной — её результаты менее универсальны, чем у type.
which cd
which -a cd4) Справка shell и списки встроенных команд
- В Bash: help и compgen -b помогут получить список встроенных команд.
- В других оболочках посмотрите соответствующую страницу справки или man-подраздел для builtins.
Пример для bash:
help cd
compgen -b | sortРазные оболочки имеют разные встроенные команды. Zsh, например, содержит много встроенных возможностей, и её документация обычно содержит отдельный раздел, посвящённый builtins.
Примеры и сценарии использования
- cd — почти всегда builtin, иначе бы смена директории выполнялась в дочернем процессе и не повлияла бы на текущую оболочку.
- echo — часто builtin, но также существует внешняя /bin/echo с отличающимся поведением.
- test/[, export, readonly, alias — обычно реализованы как встроенные.
Когда использовать внешнюю версию:
- Нужна специфическая для утилиты реализация или флаг, отсутствующий в builtin.
- Требуется детерминированность перекрытия: указав абсолютный путь (/usr/bin/echo), вы уверены, какую программу запускаете.
Когда builtin может подводить (когда не подходит)
- Совместимость: поведение builtin может отличаться между shell (bash vs zsh).
- Функциональность: внешняя утилита может поддерживать дополнительные опции.
- Отладка: внешняя программа легче заменить/просмотреть (strace, ldd и т.д.).
Чек-лист для администратора или скрипт-автора
- Проверить тип команды: type -t <команда>.
- Убедиться, что поведение builtin совпадает с требованиями (проверка опций).
- При необходимости явно указать путь к внешней утилите (/usr/bin/…).
- Учесть переносимость между shell (bash, dash, zsh, ksh).
Мини-методология: как безопасно заменить поведение в скрипте
- Определите, нужна ли вам именно функциональность shell (например, изменение окружения).
- Проверьте тип: type -t команда.
- Если требуется внешний вариант — используйте абсолютный путь.
- Добавьте проверки в скрипт для разных shell (fallback/feature detection).
Критерии приёмки
- Скрипт корректно определяет тип команды через type -t.
- Поведение не зависит от локального alias (учёт command -v).
- Если требуется внешняя утилита — скрипт использует абсолютный путь или явную проверку наличия опции.
Фактбокс — что важно запомнить
- Builtin = команда, реализованная в самом shell.
- type -t — самый надёжный быстрый тест.
- command -v и compgen полезны для скриптов и списков.
- which может вводить в заблуждение из-за вариаций реализации.
Простая блок-схема принятия решения
flowchart TD
A[Есть команда] --> B{Нужно ли изменять состояние shell?}
B -- Да --> C[Должна быть builtin]
B -- Нет --> D{Требуется особое поведение/опции?}
D -- Да --> E[Использовать внешнюю утилиту 'указать путь']
D -- Нет --> F[Можно использовать builtin или внешний вариант]Краткий глоссарий (1 строка)
- builtin — команда, встроенная в интерпретатор командной строки; выполняется без запуска отдельного процесса.
Короткая памятка по совместимости
- При переносе скриптов между системами проверьте набор builtins в целевом shell.
- Если нужен строгий, предсказуемый набор опций — фиксируйте вызов через абсолютный путь к утилите.
Здесь показан пример, где which сообщает о местоположении или помечает builtin/alias в зависимости от конфигурации. Всегда сверяйтесь с type для точности.
Итог
Shell builtins ускоряют выполнение часто используемых команд и дают доступ к состоянию самой оболочки. Используйте type -t как первичный инструмент для проверки, дополняя его command -v и списками встроенных команд через справку shell. При необходимости точной совместимости или расширенного поведения — вызывайте внешнюю утилиту по абсолютному пути.
Важно: при написании переносимых скриптов учитывайте различия между shell и явно проверяйте необходимую функциональность.
Похожие материалы
Настройка роутера для игр: оптимизация и советы
Отключить установку вне Microsoft Store в Windows 11
App Privacy Report на iPhone — просмотреть и отключить
Общие библиотеки Google Фото — настройка и использование
Восстановление пароля OneNote — лучшие инструменты