Це "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
-Команда команд - це зовнішня програма, яка складає частину системи, тому що багато дій, які вона може виконувати, не є простою вбудованою.
Жарт-старший ОК,

12
type whichміг би дати вам відповідь, чому whichви не дасте відповіді.
Дубу

1
Залежить від оболонки, яку ви використовуєте
nsn

6
Веселий факт: і те, catі lsє / було написано самим Сталлманом. Ви здивувалися б, скільки матеріалів написав він. Не забувайте, що він написав перші версії компілятора, який на сьогоднішній день є найкращим у світі компілятором, який збирає ВСЕ ТАКОЖ і більшість основних утиліт. Justinin '
Alec Teal

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 це зовнішній виконуваний файл, а не вбудований оболонку.


5
Ви можете type -all echoдізнатись (на порядок), які різні "відлуння" відомі оболонці (перший - той, який буде викликати оболонку, якщо ви не вкажете щось для зміни порядку, наприклад, виклик "echo"або \echo, або command echo)
Олів'є Дулак

Гарна відповідь. Одне доповнення: Існує дві версії echoісторичних причин. Він починався як зовнішня команда, потім був доданий як вбудований. Ранні версії оболонки Bourne ( /bin/sh) не мали. /bin/echoпідтримували сумісність, оскільки від цього залежали всілякі речі. (Те саме трапилося і з test.)
alexis

Бічна примітка: whichсама по собі може бути вбудована в cmd оболонку, наприклад, у tcsh:which which which: shell built-in command.
Dan Cornilescu,

Я запізно приїжджаю на вечірку, але чому б ви не перевірили її довідкову сторінку, і ви дійсно можете побачити число між дужками, яке вказує, чи це вбудована оболонка чи що завгодно
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
Насправді, на мій погляд, це єдина відповідь, яка стосується вашого питання :)
Андре Шалелла,

ІМХО це ^^^ правда. Ця відповідь має бути прийнятою.
LinuxSecurityFreak

4

Ще один спосіб перевірити список вбудованих оболонок: Використання compgenяких оболонки вбудовано саме!

Наступна команда перераховує всі вбудовані команди оболонки:

compgen -b

Ви можете перевірити cat, echoзіткнувшись так: -

$ 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.

Я не можу знайти жодної офіційної документації для цих параметрів, чи знаєте ви, де вона існує?
Випадково832

@ 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- чудовий приклад програми цього класу, оскільки є оболонки, які включають його як вбудований, і оболонки, яких немає. Варто зазначити, що багато команд цього класу, які доступні як вбудовані, також доступні як зовнішні програми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.