Яка різниця між вбудованою командою та командою, що її немає?


72

Чи є якась властива різниця між вбудованою командою та іншою командою, яка номінально може зробити те саме?

напр. Чи вбудовані отримують "особливу" обробку? ... хіба менше накладних керує ними? .. або вони просто просто "вбудовані"; як приладова панель вашого автомобіля?

... і чи є остаточний (поточний) список цих вбудованих?

Відповіді:


90

З ваших коментарів ви, мабуть, розгублені, що саме таке оболонка . Ядро відповідає за управління системою. Це частина, яка фактично завантажує та запускає програми, здійснює доступ до файлів, виділяє пам'ять тощо. Але ядро ​​не має інтерфейсу користувача; Ви можете спілкуватися з нею лише за допомогою іншої програми в якості посередника.

Оболонка - це програма, яка друкує підказку, зчитує з вас рядок введення, а потім інтерпретує її як одну або кілька команд для маніпулювання файлами або запуску інших програм. До винаходу GUI оболонка була основним інтерфейсом користувача ОС. На MS-DOS оболонку викликали, command.comі мало хто намагався використовувати інший. На Unix, однак, давно було кілька оболонок, з яких користувачі могли вибрати.

Їх можна розділити на 3 типи. Оболонки, сумісні з Борном, використовують синтаксис, отриманий з оригінальної оболонки Борна . C оболонка використовує синтаксис з вихідної оболонки C . Тоді є нетрадиційні оболонки, які вигадують власний синтаксис або запозичують його з якоїсь мови програмування, і, як правило, набагато менш популярні, ніж перші два типи.

Вбудована команда - це просто команда, яку оболонка виконує сама, а не інтерпретувати її як запит на завантаження та запуск якоїсь іншої програми. Це має два основні наслідки. По-перше, це зазвичай швидше, тому що завантаження та запуск програми вимагає часу. Звичайно, чим довше команда займає виконання, тим менший час завантаження порівнюється із загальним часом виконання (оскільки час завантаження досить постійний).

По-друге, вбудована команда може впливати на внутрішній стан оболонки. Ось чому такі команди, як і cd повинні бути вбудовані, оскільки зовнішня програма не може змінити поточний каталог оболонки. Інші команди, як-от echo, можуть бути вбудовані для ефективності, але немає внутрішньої причини, що вони не можуть бути зовнішніми командами.

Які команди вбудовані, залежить від оболонки, яку ви використовуєте. Вам доведеться ознайомитись з його документацією для переліку (наприклад, bashвбудовані команди перелічені у розділі 4 цього посібника ). typeКоманда може сказати вам , якщо команда вбудована (якщо оболонка POSIX-сумісна), так як POSIX вимагає , щоб typeбути вбудованим. Якщо whichу вашій оболонці не вбудований, він, ймовірно, не буде знати про вбудовані ваші оболонки, а просто шукатиме зовнішні програми.


Програми спілкуються з ядром, фактично створюючи переривання.
Натан Осман

11
@George: Програми спілкуються з ядром, видаючи системні дзвінки, які залежно від ОС та архітектури можуть або не можуть використовувати переривання. Користувачі, як правило, не видають переривань.
Жиль

2
@cjm: Це звучить так просто, коли ви пояснюєте це так:) ... Ви, звичайно, допомогли очистити туман ... просто легкий туман зараз .. (насправді це якраз така погода, сьогодні вранці. .. приємно туманно;) ... дякую
Пітер.О

@Gilles: Дійсно? Я вважав, що всі програми в режимі користувача спілкувалися з ядром через переривання (звичайно, для певних архітектур).
Натан Осман

2
@cjm Дуже ретельна та повчальна відповідь. Я багато чому навчився її читати. :)
ankush981

37

Є три рівні вбудованих утиліт:

  • Деякі утиліти дійсно є частиною оболонки як мови програмування, хоча вони не є зарезервованими словами . Вони є утилітами управління потоком ( ., :, break, continue, return, trap, exit, exec, eval), параметр пов'язаних утиліти ( set, unset, shift, export, readonly, local¹, typeset¹), псевдонім комунальних послуг ( alias², unalias²) і times³. Ці спеціальні вбудовані програми отримують спеціальну обробку:

    • Якщо ви передаєте неправильні аргументи в спеціальний вбудований, сама оболонка може перерватись, а не просто перейти до наступної команди після відображення повідомлення про помилку.
    • Синтаксис попереднього призначення foo=bar utilityмає інше значення: це звичайне призначення параметрів (тобто еквівалент foo=bar; utility), а не присвоєння середовищу протягом тривалості утиліти.
  • Деякі утиліти потрібно реалізувати всередині оболонки, оскільки вони діють на внутрішні налаштування оболонки. Це включає:

    • комунальні послуги , які діють на поточний каталог оболонки , такі як cd, dirs, pushd, popd;
    • контроль роботи утиліти , такі як bg, disown, fg, jobs, wait;
    • комунальні послуги , які зчитують або маніпулюють інші атрибути оболонки , такі як builtin, command, hash, read, type, ulimit, umask;
    • комунальні послуги , пов'язані з інтерактивними функціями, коли вони присутні, такі як fc, history, bind.
  • Деякі утиліти , як правило , реалізовані в вигляді вбудованих модулів виключно для виконання : echo, printf, test, true, false.

Розширені оболонки, такі як bash , ksh і zsh, як правило, мають більше вбудованих модулів, часто для впровадження нестандартних функцій (як правило, для взаємодії). Посібник кожної оболонки розповість про те, які команди вбудовані, хоча деякі оболонки ( принаймні zsh ) підтримують динамічно завантажувані модулі, які можуть забезпечити більше вбудованих модулів.

¹ Невідомий POSIX, але спеціальний у ksh та кількох інших оболонках.
² Звичайна в POSIX, але спеціальна в ksh та кількох інших оболонках.
³ В ksh, timesобгортка навколо timeключового слова: це псевдонім { { time;} 2>&1;}. Зауважте, що POSIX дозволяє timeбути зовнішньою утилітою зі звичайним розбором або ключовим словом, яке застосовується до цілого конвеєра (який знаходиться в ksh, bash в zsh).


3
Ці відмінності є дійсно важливими.
dmckee

Швидке запитання, а що означає "звичайне призначення параметрів", коли ми це робимо while IFS= read -r line?
Сергій Колодяжний

@SergiyKolodyazhnyy readне є спеціальним вбудованим, тому IFS=readвстановлює змінну лише на час дії команди.
Жиль

10

Вбудований - це команда, що надається оболонкою, а не зовнішньою програмою. Ось списки для bashвбудованих 's (вони також перераховані на сторінці bash man) і zsh' s вбудованих . kshнадає список за допомогою запуску builtin.

Щоб знати, чи є певна команда вбудованою, можна запустити type command. Спробуйте type forі type lsпобачити це.


typeздається, робить трюк; дякую за це ... але мені все одно цікаво, що означає "надана оболонка" ... Можливо, мені потрібно більш повно зрозуміти, як оболонка стосується ядра .... але не о 2 ранку. Я прийду повернемось до цього завтра
Peter.O

1

Кожен дистрибутив і оболонка мають різну колекцію команд проти вбудованих функцій оболонки. Загалом ідея полягає в тому, що в оболонки вбудовані найпоширеніші та прості функції, щоб заощадити час, швидкість та інтегрувати волю з рештою їхнього набору функцій. Накладні витрати набагато нижчі, оскільки не потрібно запускати інший системний процес. Однак можна змішувати і поєднувати. Ви можете запустити одну оболонку, яка має що-небудь збірку, але мати цю команду і у вашій системі. Зазвичай вбудований би брав пріоритет, але ви могли це контролювати.

Ви можете легко дізнатися, чи є конкретна команда вбудованою чи ні, запустивши type mycommand. Більшість сторінок оболонок також мають список їх вбудованих.

Редагувати: Використовуйте, typeщоб дізнатися, чи є команда вбудованою, а якщо ні, whichщоб дізнатися, звідки вона буде виконуватися.


@Caleb: дякую за ваш коментар, але це залишає мені цікаво, що саме таке "системний процес" .. Я все ще бачу посилання на це, але я не розумію, у чому різниця лежить .... (btw я не можу дивіться, як "який" є абсолютним показником) .. наприклад .. "який =>"/bin/echo" and тип ехо echo =>"echo is a shell builtin", but 'which dd=>" / bin / dd "і type dd=>" dd є / bin / dd "... так, я частково там ....
Пітер.О

"Система обробляє" просто означає, що вона запускається як незалежна програма, якою керує ядро. Альтернативою у випадку вбудованих є лише виконання підфункції у вже запущеному коді вашої оболонки. У прикладі, який ви наводите, typeкращий показник того, що виконується, але ви помітили echo, що це вбудований і є додаток з таким ім'ям. Якщо у вашій оболонці не було вбудованої системи, вона запустилася б.
Калеб

2
whichце не обов'язково вбудована команда, і якщо її немає, вона не буде знати про вбудовані оболонки. POSIX вимагає, щоб typeце була вбудована команда, тому вона завжди знає про вбудовані модулі.
cjm

Багато систем постачаються з псевдонімом whichдо typeчи іншого набору варіантів, наприклад alias which='type -path'- це може стати джерелом плутанини.
Випадково832

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