Когда я использую type
команду, чтобы выяснить, cat
является ли встроенная оболочка или внешняя программа, я получаю вывод ниже:
-$ type cat
cat is hashed (/bin/cat)
-$
Значит ли это, что cat
это внешняя программа /bin/cat
?
Я запутался, потому что, когда я проверил вывод ниже, echo
я увидел, что это built-in
также программа/bin/echo
-$ type echo
echo is a shell builtin
-$ which echo
/bin/echo
-$
Поэтому я не мог использовать логику, которая /bin/cat
обязательно означает внешнюю программу, потому что эхо было, /bin/echo
но все же встроенным.
Так откуда мне знать, что это cat
такое? Встроенный или внешний?
bash
cat
echo
shell-builtin
СФС
источник
источник
type which
может дать вам ответ, почемуwhich
не даст вам ответ.cat
иls
будут / были написаны самим Столлмана. Вы будете удивлены, сколько вещей он написал. Не забывайте, что он написал первые версии компилятора, который на сегодняшний день является лучшим в мире компилятором, который компилирует ВСЕ и большинство основных утилит. Просто говорюОтветы:
type
говорит вам, что будет использовать оболочка. Например:Это означает, что если вы введете в командной строке bash
echo
, вы получите встроенный. Если вы укажете путь, как в/bin/echo
, вы получите внешнюю команду.which
напротив, это внешняя программа, которая не имеет специальных знаний о том, что будет делать оболочка. В системах, подобных debian,which
это сценарий оболочки, который ищет в PATH исполняемый файл. Таким образом, он даст вам имя внешнего исполняемого файла, даже если оболочка будет использовать встроенный.Если команда доступна только как встроенная,
which
ничего не вернется:Теперь давайте посмотрим на
cat
:cat
это внешний исполняемый файл, а не встроенная оболочка.источник
type -all echo
выяснить (по порядку), какие разные «эхо» известны оболочке (первой будет та, которую вызовет оболочка, если вы не укажете что-то для изменения порядка, например, вызов"echo"
или\echo
, илиcommand echo
)echo
по историческим причинам. Он начинался как внешняя команда, затем был добавлен как встроенный. Ранние версии оболочки Bourne (/bin/sh
) не имели ее./bin/echo
был сохранен для совместимости, так как от этого зависели все виды вещей. (То же самое случилось сtest
.)which
само по себе может быть встроенным в оболочку cmd, например, в tcsh:which which
which: shell built-in command.
cat is hashed (/bin/cat)
это какcat is /bin/cat
(то есть, это внешняя программа ).Разница в том, что вы уже участвовали
cat
в этом сеансе, поэтому bash уже посмотрел его в$PATH
и сохранил результирующее местоположение в хеш-таблице, поэтому в этом сеансе его искать не нужно.Чтобы увидеть все команды, которые были хэшированы в вашем сеансе, запустите
hash
источник
Еще один способ проверить список встроенных оболочек: используя
compgen
который встроенная оболочка сама!Следующая команда перечисляет все встроенные команды оболочки:
Вы можете проверить
cat
,echo
greping как: -Вы можете увидеть
compgen -b | grep cat
возврат без вывода, значитcat
это не встроенная оболочка .Посетите список полезных опций, предоставленных
compgen
.Вы также можете использовать другую встроенную команду:
help
для отображения встроенной оболочки.источник
compgen
?man bash | grep -e '-A action$' -A 32
, возможно, получишь вывод вот так . (увеличить / уменьшить цифру после того,-A
как правильно управлять).Вы также можете использовать
whereis
более эффективную команду , так как она показывает, где находится команда на машине, например, библиотека страниц справочника и т. Д.источник
Другие уже ответили о
cat
, я просто хотел бы объяснить проблемуecho
. Если вы используете тип в-a
опции (список всех матчей), вы увидите , чтоecho
это и является встроенной оболочки и внешней программы:Эти два полностью независимы друг от друга.
type
без параметров просто вернет первую найденную подходящую команду. Итак, typefoo
покажет вам, что будет выполнено, если вы запуститеfoo
. Могут быть и другие варианты, но они не будут показаны, если вы не используете-a
.источник
Так как здесь есть несколько хороших ответов об использовании типа, чтобы выяснить, является ли такая команда
cat
встроенной или внешней программой. Я собираюсь принять более общий подход. Есть некоторые команды, которые должны быть встроены, потому что они влияют на текущую оболочку. Три классических примеровcd
,exec
иexit
. Есть некоторые команды, которые не должны быть встроенными, потому что их функциональность зависит от поведения execve или системных вызовов. Примеры таких программ включаютsu
,sudo
,calife
иsuper
. Все остальные команды могут быть построены как встроенные или внешние программы.cat
Это отличный пример программы этого класса, так как есть оболочки, которые включают его как встроенные, и оболочки, которые этого не делают. Стоит отметить, что многие команды этого класса, доступные как встроенные, также доступны как внешние программы.источник