Что делает встроенная команда в bash?

35

Я знаю, что такое встроенная команда, но что она делает builtinсама? Выполнение which lsпоказывает мне /bin/ls, но выполнение which builtinничего не возвращает.

man builtinпросто дает мне список встроенных команд, одной из которых является builtin. Остальная часть справочной страницы объясняет, что такое встроенное, но не то, что builtinесть.

builtin --helpговорит мне, builtin: usage: builtin [shell-builtin [arg ...]]но все еще не то, что он делает.

Является ли это частью bash в отличие от других встроенных команд?

lfalin
источник
3
Вы забыли help builtin.
Игнасио Васкес-Абрамс
3
which builtinне возвращает результатов, так как whichсообщает о расположении внешних команд . Если вы спросите раковину type builtin, она скажет вам, что неудивительно, что builtin is a shell builtin. Вы найдете то же самое с alias, setи т. Д.
Тоби Спейт
1
builtin help builtin
theonlygusti

Ответы:

50

Команда builtinгарантирует, что вы запускаете встроенную в оболочку версию команды, а не запускаете другую команду с тем же именем.

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

И, между прочим, моя копия справочной страницы bash имеет раздел под названием «Команды сборки оболочки», и он определяет значение builtinкоманды в этом разделе (расшифровано ниже).

встроенная оболочка-встроенная [аргументы]

    Выполнить указанную встроенную оболочку, передав ей аргументы, и
    вернуть свой статус выхода. Это полезно при определении функции
    имя которого совпадает с именем встроенной оболочки, сохраняя
    функциональность встроенной функции. Встроенный CD
    обычно переопределяется таким образом.

    Статус возврата - false, если встроенная оболочка не является встроенной
    команда.
Spiff
источник
14
хороший ответ. Но меня удивляет, как вы можете быть уверены, что builtinкоманда - настоящая встроенная команда bash?
Пакопако,
14
@Pacopaco: Вы не можете :-). Вы можете переопределить builtin, тоже: function builtin { echo "Hi from builtin :-)"; }. Тогда builtinбольше не работает.
слеске
12
@Pacopaco, type builtinскажу вам, правда ли это builtin. Если только он typeне был заменен не встроенным type...
Тоби Спейт
10
о ... к сожалению, можно: alias unset = "echo unset переопределяется"; псевдоним псевдоним = "псевдоним эхо переопределен" ... Так что не повезло.
Оливье Дюлак
8
Мне нравится эта постоянная дискуссия!
Сэм Уивер