'Cat' - встроенная оболочка или внешняя программа?

33

Когда я использую 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такое? Встроенный или внешний?

СФС
источник
1
-Команда cat - это внешняя программа, составляющая часть системы, поскольку многие действия, которые она может выполнять, не являются простыми встроенными.
Шутка старшего ОК
12
type whichможет дать вам ответ, почему whichне даст вам ответ.
Дубу
1
Зависит от используемой вами оболочки
nsn
6
Забавный факт: как catи lsбудут / были написаны самим Столлмана. Вы будете удивлены, сколько вещей он написал. Не забывайте, что он написал первые версии компилятора, который на сегодняшний день является лучшим в мире компилятором, который компилирует ВСЕ и большинство основных утилит. Просто говорю
Алек Тил
2
@AlecTeal Вы понимаете, что большинство систем Unix используют версии ls и cat, которые давно предшествуют версиям GNU, к которым приложил руку Ричард Столлман?
Росс Ридж

Ответы:

59

typeговорит вам, что будет использовать оболочка. Например:

$ type echo
echo is a shell builtin
$ type /bin/echo
/bin/echo is /bin/echo

Это означает, что если вы введете в командной строке bash echo, вы получите встроенный. Если вы укажете путь, как в /bin/echo, вы получите внешнюю команду.

whichнапротив, это внешняя программа, которая не имеет специальных знаний о том, что будет делать оболочка. В системах, подобных debian, whichэто сценарий оболочки, который ищет в PATH исполняемый файл. Таким образом, он даст вам имя внешнего исполняемого файла, даже если оболочка будет использовать встроенный.

Если команда доступна только как встроенная, whichничего не вернется:

$ type help
help is a shell builtin
$ which help
$ 

Теперь давайте посмотрим на cat:

$ type cat
cat is hashed (/bin/cat)
$ which cat
/bin/cat

cat это внешний исполняемый файл, а не встроенная оболочка.

John1024
источник
5
Вы можете type -all echoвыяснить (по порядку), какие разные «эхо» известны оболочке (первой будет та, которую вызовет оболочка, если вы не укажете что-то для изменения порядка, например, вызов "echo"или \echo, или command echo)
Оливье Дюлак
Хороший ответ. Одно дополнение: есть две версии echoпо историческим причинам. Он начинался как внешняя команда, затем был добавлен как встроенный. Ранние версии оболочки Bourne ( /bin/sh) не имели ее. /bin/echoбыл сохранен для совместимости, так как от этого зависели все виды вещей. (То же самое случилось с test.)
Алексис
Примечание: whichсамо по себе может быть встроенным в оболочку cmd, например, в tcsh:which which which: shell built-in command.
Дан Корнилеску
Я опаздываю на вечеринку, но почему бы вам не проверить ее справочную страницу, и вы можете увидеть число между круглыми скобками, которое указывает, является ли это встроенной оболочкой или чем-то еще
poz2k4444
46

cat is hashed (/bin/cat)это как cat is /bin/cat(то есть, это внешняя программа ).

Разница в том, что вы уже участвовали catв этом сеансе, поэтому bash уже посмотрел его в$PATH и сохранил результирующее местоположение в хеш-таблице, поэтому в этом сеансе его искать не нужно.

Чтобы увидеть все команды, которые были хэшированы в вашем сеансе, запустите hash

$ hash
hits    command
   2    /usr/bin/sleep
   3    /usr/bin/man

$ type sleep
sleep is hashed (/usr/bin/sleep)

$ type man
man is hashed (/usr/bin/man)

$ type ls
ls is /usr/bin/ls

$ type cat
cat is /usr/bin/cat

$ type echo
echo is a shell builtin
Андре Шалелла
источник
9
На самом деле, на мой взгляд, это единственный ответ, который отвечает на ваш вопрос :)
Андре Chalella
ИМХО это ^^^ верно. Этот ответ должен быть принятым.
LinuxSecurityFreak
4

Еще один способ проверить список встроенных оболочек: используя compgenкоторый встроенная оболочка сама!

Следующая команда перечисляет все встроенные команды оболочки:

compgen -b

Вы можете проверить cat, echogreping как: -

$ compgen -b | grep echo
echo
$ compgen -b | grep cat
$ 

Вы можете увидеть compgen -b | grep catвозврат без вывода, значит catэто не встроенная оболочка .

Посетите список полезных опций, предоставленных compgen.


Вы также можете использовать другую встроенную команду: helpдля отображения встроенной оболочки.

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.
Pandya
источник
Я не могу найти никакой официальной документации для этих опций, вы знаете, где она существует?
Random832
@ Random832 ты говоришь о вариантах compgen?
Пандья
да, я не смог найти ничего на странице руководства Bash о том, что означает -b или половина других опций. Нашел позже в gnu.org/software/bash/manual/html_node/...
Random832
@ Random832 попробуй man bash | grep -e '-A action$' -A 32, возможно, получишь вывод вот так . (увеличить / уменьшить цифру после того, -Aкак правильно управлять).
Пандя
4

Вы также можете использовать whereisболее эффективную команду , так как она показывает, где находится команда на машине, например, библиотека страниц справочника и т. Д.

Шутка старший ок
источник
-Извините за мой плохой английский, потому что я только учусь и не очень хорошо использую! ...
Шутка-старший ОК
2

Другие уже ответили о cat, я просто хотел бы объяснить проблему echo. Если вы используете тип в -aопции (список всех матчей), вы увидите , что echoэто и является встроенной оболочки и внешней программы:

$ type -a echo
echo is a shell builtin
echo is /bin/echo

Эти два полностью независимы друг от друга. typeбез параметров просто вернет первую найденную подходящую команду. Итак, type fooпокажет вам, что будет выполнено, если вы запустите foo. Могут быть и другие варианты, но они не будут показаны, если вы не используете -a.

Тердон
источник
2

Так как здесь есть несколько хороших ответов об использовании типа, чтобы выяснить, является ли такая команда catвстроенной или внешней программой. Я собираюсь принять более общий подход. Есть некоторые команды, которые должны быть встроены, потому что они влияют на текущую оболочку. Три классических примеров cd, execи exit. Есть некоторые команды, которые не должны быть встроенными, потому что их функциональность зависит от поведения execve или системных вызовов. Примеры таких программ включают su, sudo, califeи super. Все остальные команды могут быть построены как встроенные или внешние программы.catЭто отличный пример программы этого класса, так как есть оболочки, которые включают его как встроенные, и оболочки, которые этого не делают. Стоит отметить, что многие команды этого класса, доступные как встроенные, также доступны как внешние программы.

hildred
источник