Різниця між sh і bash


1303

При написанні програм оболонок ми часто використовуємо /bin/shі /bin/bash. Я зазвичай використовую bash, але не знаю, в чому різниця між ними.

У чому головна відмінність між bashі sh?

Що ми повинні мати на увазі при програмуванні в bashі sh?


21
Про корисний список башизмів та відповідний код, який працює на оболонці Борна, дивіться на mywiki.wooledge.org/Bashism
StackExchange saddens dancek

1
Ви можете побачити стандарт POSIX для sh та його командної мови: * sh * Мова командної оболонки
Maurício C Antunes

7
як правило, всі скрипти sh працюватимуть під bash завдяки сумісності з posix, але не всі скрипти bash можуть працювати під sh. Основні відмінності, які ви помічаєте, - такі речі, як [[]] замість [] порівнянь, які дозволяють процитувати котирування, $ (()) замість арифметичних виразів $ [() та інших речей, таких як "занадто великий і занадто повільний" безпосередньо з bash dokcs. Але нові скриптери не повинні обмежуватися скриптами, сумісними з sh, якщо вони не знімають для деяких відстала сумісність, що частіше за все не буває в наші дні, зрештою, це (або був ...) 2014 рік правильний ??
osirisgothra

Відповіді:


1140

Що ш

sh(або Мова командної оболонки) - мова програмування, описана стандартом POSIX . Вона має безліч реалізацій ( ksh88, dash, ...). bashтакож можна вважати реалізацією sh(див. нижче).

Оскільки shспецифікація, а не реалізація /bin/sh- це симпосилання (або жорстке посилання) до фактичної реалізації в більшості систем POSIX.

Що таке баш

bashрозпочався як shсумісна реалізація (хоча вона передувала стандарту POSIX протягом кількох років), але з часом вона набула багатьох розширень. Багато з цих розширень можуть змінити поведінку дійсних сценаріїв оболонки POSIX, тому само по собі bashне є дійсною оболонкою POSIX. Скоріше, це діалект мови оболонки POSIX.

bashпідтримує --posixкомутатор, що робить його більш сумісним з POSIX. Він також намагається імітувати POSIX, якщо його викликають як sh.

ш = баш?

Тривалий час /bin/shвикористовується для вказівки /bin/bashна більшість систем GNU / Linux. В результаті цього майже стало безпечно ігнорувати різницю між ними. Але це почало змінюватися нещодавно.

Деякі популярні приклади систем /bin/sh, на які не вказується /bin/bash(а на деяких з яких /bin/bashможе навіть не існувати), є:

  1. Сучасні системи Debian та Ubuntu, які за замовчуванням посилаються shна посилання dash;
  2. Busybox , який зазвичай запускається під час завантаження системи Linux як частина initramfs. Він використовує реалізацію ashоболонки.
  3. BSD і взагалі будь-які нелінукс-системи. Використовує OpenBSD pdksh, нащадок оболонки Корна. FreeBSD shє нащадком оригінальної оболонки UNIX Bourne. Solaris має власну, shяка тривалий час не відповідала POSIX; безкоштовна реалізація доступна від проекту Heirloom .

Як ви можете дізнатися, на що /bin/shвказує ваша система?

Ускладнення полягає в тому, що це /bin/shможе бути символічним посиланням або твердим посиланням. Якщо це символічне посилання, портативний спосіб вирішити це:

% file -h /bin/sh
/bin/sh: symbolic link to bash

Якщо це міцне посилання, спробуйте

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

Насправді -Lпрапор охоплює як посилання, так і жорсткі посилання, але недоліком цього методу є те, що він не є портативним - POSIX не потребує find підтримки -samefileопції, хоча і GNU find, і FreeBSD знаходять підтримку.

Лінія Шебанг

Зрештою, вам вирішити, який саме використовувати, написавши рядок «shebang» як перший рядок сценарію.

Напр

#!/bin/sh

буде використовувати sh(і що б там не трапилось),

#!/bin/bash

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

#!/bin/dash

Який використовувати

Для власних сценаріїв я віддаю перевагу shз наступних причин:

  • вона стандартизована
  • набагато простіше і простіше вчитись
  • він портативний у системах POSIX - навіть якщо вони трапляються bash, їх немаєsh

Є і переваги використання bash. Його особливості роблять програмування більш зручним і схожим з програмуванням в інших сучасних мовах програмування. Сюди входять такі речі, як масштабовані локальні змінні та масиви. Plain sh- це дуже мінімалістична мова програмування.


Якщо ви запускаєте сценарій із bashспособом відображення, більше корисних повідомлень про помилки у разі помилки синтаксису. Ви можете просто заощадити час, використовуючи bash.
PHPst

Що %означає на початку ваших командних рядків?
ДжозефГарріотт

@JosephHarriott - це підказка: символ, надрукований самою оболонкою, після якої слідує ваша команда. Деякі оболонки використовують $замість %або #для кореневої оболонки.
Роман Чепляка

@ РоманЧепляка, які снаряди? Я бачив лише колись $і #...
ДжозефГарріотт

@RomanCheplyaka Я впевнений, що shіснував задовго до удару (що означає оболонку bourne-again). Але це було дуже примітивно і не реагувало на термінальні події, як ESCперсонажі. Потім kshприйшов (теж до bash), потім bash розпочали ті, хто любив ідею кращої оболонки, але ненавидів ksh. :-)
raminr

145

sh: http://man.cx/sh
bash : http://man.cx/bash

TL; DR : bashце набір shз більш елегантним синтаксисом та більшою функціональністю. Використовувати лінію bash shebang безпечно майже у всіх випадках, оскільки це досить всюди на сучасних платформах.

Зверніть увагу: у деяких середовищах sh є bash . Перевірити sh --version.


31
якщо bash викликається як sh, він поводиться трохи інакше. Див. Gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files ("Викликається з ім'ям sh") та gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode . Наприклад, без заміщення процесу.
Гленн Джекман

11
Оскільки bash - це супернабір sh, а деякі ОС, такі як FreeBSD, не мають встановленого bash за замовчуванням, сценарії в sh дадуть більшу портативність.
користувач674062

1
Оскільки не існує портативного сценарію для отримання оболонки POSIX для певного сценарію, портативні сценарії не можуть мати більше, ніж функції Bourne Shell.
schily

83

Це питання часто номіновано як канонічне для людей, які намагаються використовувати, shі дивуються, що воно не так поводиться bash. Ось швидкий порядок поширених непорозумінь та підводних каменів.

По-перше, ви повинні зрозуміти, чого очікувати.

  • Якщо ви запускаєте свій скрипт sh scriptname, або запускаєте його scriptnameі маєте #!/bin/shв рядку shebang , слід очікувати shповедінки POSIX .
  • Якщо ви запускаєте свій скрипт bash scriptname, або запускаєте його scriptnameі маєте #!/bin/bash(або локальний еквівалент) у рядку shebang, слід очікувати поведінки Баша.

Правильний шебанг та запуск сценарію, ввівши лише ім'я сценарію (можливо, з відносним або повним шляхом ), як правило, є кращим рішенням. Крім правильного шебангу, для цього потрібен файл сценарію, щоб мати дозвіл на виконання ( chmod a+x scriptname).

Отже, як вони насправді відрізняються?

У посібнику Bash Reference є розділ, який намагається перерахувати відмінності, але деякі загальні джерела плутанини включають

  • [[недоступний в sh(лише [який є більш чітким і обмеженим).
  • sh не має масивів.
  • Деякі ключові слова Bash подобається local, source, function, shopt, let, declare, і selectНЕ портативний sh. (Деякі shреалізації підтримують, наприклад local.)
  • Bash має багато розширень синтаксису в стилі C, таких як for((i=0;i<=3;i++))цикл три аргументи , +=приріст інкременту тощо. Ця $'string\nwith\tC\aescapes'функція орієнтовно прийнята для POSIX (це означає, що вона працює в Bash зараз, але вона ще не підтримується shв системах, які дотримуються лише поточного Специфікація POSIX, і, швидше за все, не буде в майбутньому).
  • Підтримка Bash <<<'here strings'.
  • Bash має *.{png,jpg}і {0..12}розширення дужок.
  • ~посилається $HOMEлише на Bash (і в загальному випадку ~usernameна домашній каталог username).Це в POSIX, але він може бути відсутній у деяких перед-POSIX- /bin/shреалізаціях.
  • Bash має процес заміщення <(cmd)та >(cmd).
  • Bash має псевдоніми зручності переадресації у стилі Csh як &|для 2>&1 |і &>для> ... 2>&1
  • Bash підтримує копроцеси з <>перенаправленням.
  • Bash має багатий набір розширених нестандартних розширень параметрів, таких як ${substring:1:2}, ${variable/pattern/replacement}перетворення справ тощо.
  • Bash має значно розширені можливості для арифметики оболонок (хоча досі немає підтримки з плаваючою комою). Існує застарілий застарілий $[expression]синтаксис, який, проте, слід замінити арифметичним $((expression))синтаксисом POSIX . (Деякі застарілі shвведення до POSIX, можливо, не підтримують це.)
  • Чарівні змінні , такі як $RANDOM, $SECONDS, $PIPESTATUS[@]і $FUNCNAMEє розширеннями Bash.
  • Синтаксичні відмінності, такі як export variable=valueі [ "x" == "y" ]які не є портативними ( export variableповинні бути окремими від присвоєння змінної та порівняння портативних рядків у [ ... ]використанні одного знака рівності).
  • Багато, багато розширень лише для Bash, щоб увімкнути або вимкнути необов'язкове поведінку та виявити внутрішній стан оболонки.
  • Багато, багато зручних функцій для інтерактивного використання, які, однак, не впливають на поведінку сценарію.

Пам'ятайте, це скорочений список. Повний посібник див. У посібнику з посилання та http://mywiki.wooledge.org/Bashism для багатьох хороших способів вирішення; та / або спробуйте http://shellcheck.net/, який попереджає про багато функцій лише для Bash.

Поширена помилка полягає в тому, щоб мати #!/bin/bashрядок shebang, але потім все-таки використовувати sh scriptnameдля фактичного запуску сценарію. Це в основному вимикає будь-яку функцію лише для Bash, тому ви отримуєте синтаксичні помилки, наприклад, для спроби використання масивів. (Рядок shebang є синтаксично коментарем, тому її просто ігнорують у цьому сценарії.)

На жаль, Bash не попередить, коли ви намагатиметеся використовувати ці конструкції, коли вони викликаються як sh. Він також не повністю відключає всі функціональні можливості Bash, тому запуск Bash, викликаючи його, як shне є гарним способом перевірити, чи правильно переноситься ваш сценарій в ash/ dash/ POSIX shабо такі варіанти, як Heirloomsh


2
В принципі, TL; DR ersion є відповіддю і в .
трійка

4
shellcheck.net був усім, що мені потрібно. дуже дякую.
Джош Хабдас

FWIW, export variable=valueпризначений POSIX: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Можливо, його немає в деяких древніх снарядах, але це точно не башізм.
Роман Чепляка

53

Shell - це інтерфейс між користувачем та ОС для доступу до послуг операційної системи. Це може бути GUI або CLI (інтерфейс командного рядка).

sh (Bourne sh ell) - інтерпретатор командного рядка оболонки для операційних систем, схожих на Unix / Unix. Він надає деякі вбудовані команди. У мові сценаріїв ми позначаємо перекладача як #!/bin/sh. Це була одна з найбільш широко підтримуваних іншими снарядами, як bash (вільний / відкритий), kash (не вільний).

Bash ( B ourne a gain s hell) - це заміна оболонки для оболонки Борна. Баш - суперсет ш. Баш підтримує ш. POSIX - це набір стандартів, що визначають, як повинні працювати POS-сумісні системи. Bash насправді не підтримує POSIX оболонки. Мовою сценаріїв ми позначаємо перекладача як #!/bin/bash.

Аналогія:

  • Shell - це як інтерфейс, або технічні характеристики, або API.
  • sh - клас, який реалізує інтерфейс Shell.
  • Bash - це підклас ш.

введіть тут опис зображення


3
Я не розумію. Ви згадали і "Bash є суперсеть sh", і "Bash - це підклас sh", чи не суперечать вони твердженням? Ви можете, будь ласка, уточнити?
Кеертана Прабхакаран

11
Я думаю, що це намагається сказати, що Bash успадковує sh(значить, це "підклас" в розумінні OOP) і розширює його (тому є надмножина функціональності).
трійчатка

52

Публікація від UNIX.COM

Особливості оболонки

У цій таблиці нижче перелічено більшість функцій, які, на мою думку, змусять вас вибрати одну оболонку над іншою. Він не призначений для остаточного переліку і не включає кожну можливу особливість для кожної можливої ​​оболонки. Функція вважається оболонкою лише у версії, що постачається з операційною системою, або якщо вона доступна як складена безпосередньо зі стандартного дистрибутива. Зокрема, зазначена нижче оболонка C - це те, що доступне на SUNOS 4. *, значна кількість постачальників тепер замість цього постачає або tcsh, або власну розширену оболонку C (вони не завжди роблять очевидним, що вони доставляють tcsh.

Код:

                                     sh   csh  ksh  bash tcsh zsh  rc   es
Job control                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    N    N    Y

Ключ до таблиці вище.

Y Функція може бути виконана за допомогою цієї оболонки.

N Особливість відсутня в оболонці.

F Функція може здійснюватися лише за допомогою механізму функції оболонок.

L Бібліотека читання рядків повинна бути пов'язана з оболонкою, щоб увімкнути цю функцію.

Примітки до таблиці вище

1. This feature was not in the original version, but has since become
   almost standard.
2. This feature is fairly new and so is often not found on many
   versions of the shell, it is gradually making its way into
   standard distribution.
3. The Vi emulation of this shell is thought by many to be
   incomplete.
4. This feature is not standard but unofficial patches exist to
   perform this.
5. A version called 'pdksh' is freely available, but does not have
   the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.

Ваша таблиця для мене не корисна, оскільки вона намагається зіставити функції оболонки Борна і функції з ksh з попереднього 1988 року. Якщо ви дійсно робите таблицю за 1988 рік, вам потрібно буде видалити більшу частину інших оболонок з цієї таблиці, включаючи bash , ш і rc. Чи можете ви пояснити, звідки ви взяли значення для таблиці?
schily

1
Дозвольте додати деякі підказки: Job Control був доданий до Bourne Shell в 1989 році, а Bourne Shell був відкритий в OpenSource в 2005 році. Оболонка Korn замінила процес принаймні з 1988 року, а OpenSource - з 1997 року. BTW: ваші заяви щодо $ ENV невірні, $ ENV читається / виконується лише для інтерактивних оболонок.
schily

3
@schily Це повідомлення було захоплено з сайту cs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.html
SriniV

@schily Якщо ви вважаєте, що це десь неправильно, будь ласка, відредагуйте це відповідним чином.
SriniV

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

24

ТЕРМІНАЛ

  • програма (и), що ставлять вікно вгору
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm та eterm.

ШЕЛА

  • Це програма, яка працює в терміналі
  • Shell - це і інтерпретатор команд, і мова програмування
  • Shell - це просто макропроцесор, який виконує команди.
  • Макропроцесор означає функціональність, де текст і символи розширюються для створення більших виразів.

SH Vs. БАШ

SH

  • (SHell)
  • Є специфічною оболонкою
  • інтерпретатор команд та мова програмування
  • Попередник БАШ

БАШ

  • (Борн-знову Шелл)
  • Є специфічною оболонкою
  • інтерпретатор команд та мова програмування
  • Має функціональність sh та багато іншого
  • Наступник SH
  • BASH - стандартний SHELL

СПОСОБНИЙ МАТЕРІАЛ:

SHELL gnu.org:

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

Оболонка Unix - це і інтерпретатор команд, і мова програмування. Як інтерпретатор команд, оболонка надає користувальницький інтерфейс для багатого набору утиліт GNU. Особливості мови програмування дозволяють комбінувати ці утиліти. Файли, що містять команди, можна створювати та ставати самими командами. Ці нові команди мають такий самий статус, як і системні команди в таких каталогах, як / bin, що дозволяє користувачам або групам створювати власні середовища для автоматизації їх загальних завдань.

Оболонки можуть використовуватися в інтерактивному або неінтерактивному режимі. В інтерактивному режимі вони приймають введення, введене з клавіатури. Під час виконання неінтерактивних команд оболонки виконують команди, прочитані з файлу.

Оболонка дозволяє виконувати команди GNU, як синхронно, так і асинхронно. Оболонка чекає завершення синхронних команд, перш ніж приймати більше введення; асинхронні команди продовжують виконувати паралельно оболонці, поки вона читає та виконує додаткові команди. Конструкти перенаправлення дозволяють тонкозернистий контроль над входом і виходом цих команд. Крім того, оболонка дозволяє контролювати вміст команд.

Оболонки також забезпечують невеликий набір вбудованих команд (вбудованих модулів), що реалізують функціональні можливості, які неможливо або незручно отримати за допомогою окремих утиліт . Наприклад, CD, перерва, продовження та exec не можуть бути реалізовані поза оболонки, оскільки вони безпосередньо маніпулюють самою оболонкою. Історії, getotts, kill або pwd вбудовані, серед іншого, можуть бути реалізовані в окремих утилітах, але їх зручніше використовувати як вбудовані команди. Всі вбудовані оболонки описані в наступних розділах.

Хоча виконання команд є важливим, більша частина потужності (і складності) оболонок обумовлена ​​вбудованими мовами програмування. Як і будь-яка мова високого рівня, оболонка забезпечує змінні, конструкції управління потоком, цитування та функції.

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

BASH gnu.org:

Bash - оболонка або інтерпретатор мови команд для операційної системи GNU. Назва є абревіатурою "Bourne-Again SHell", каламбура на Стівена Борна, автора прямого предка нинішньої оболонки Unix, що з'явився у версії Unix для дослідження дослідницької лабораторії сьомого видання.

Bash значною мірою сумісний з sh і включає корисні функції з Korn оболонки ksh та C shell Csh. Він повинен бути відповідною реалізацією частини оболонки та інструментів IEEE POSIX для специфікації IEEE POSIX (стандарт IEEE 1003.1). Він пропонує функціональні вдосконалення над sh як для інтерактивного, так і для програмування.

Хоча операційна система GNU надає інші оболонки, включаючи версію csh, Bash - оболонка за замовчуванням . Як і інше програмне забезпечення GNU, Bash досить портативний. В даний час він працює майже на кожній версії Unix та кількох інших операційних системах - незалежно підтримувані порти існують для платформ MS-DOS, OS / 2 та Windows.


14

Інші відповіді, як правило, вказували на різницю між Bash і стандартом оболонки POSIX. Однак при написанні переносних скриптів оболонки та їх використанні для синтаксису Bash, список типових башизмів та відповідних чистих рішень POSIX дуже зручний. Такий список був складений, коли Ubuntu перейшов з Bash на Dash як системну оболонку за замовчуванням, і його можна знайти тут: https://wiki.ubuntu.com/DashAsBinSh

Більше того, існує чудовий інструмент, який називається checkbashism, який перевіряє наявність башизмів у вашому сценарії і стає корисним, коли ви хочете переконатися, що ваш скрипт є портативним.


Це в основному те, на що справді зводиться моя відповідь. +1
трійка

7

Вони майже однакові, але bashмають більше можливостей - shє (більш-менш) старшою підмножиною bash.

shчасто означає оригінал Bourne shell, який передував bash( Bourne *again* shell), і був створений у 1977 році. Але на практиці, можливо, краще вважати його як високоперехресну сумісну оболонку, сумісну зі стандартом POSIX 1992 року.

Сценарії, які починаються з оболонки #!/bin/shабо використовують її, shзазвичай роблять це для зворотної сумісності. Будь-яка ОС Unix / linux матиме shоболонку. У Ubuntu shчасто викликає, dashа на MacOS - це спеціальна версія POSIX bash. Ці оболонки можуть віддавати перевагу для стандартної поведінки, швидкості та зворотної сумісності.

bashНовіший за оригінал sh, додає більше функцій та прагне бути сумісними назад sh. Теоретично shпрограми повинні працювати bash. bashдоступний майже на всіх машинах Linux / unix і зазвичай використовується за замовчуванням - за винятком випадків, де MacOS за замовчуванням ставиться до zshКаталіни (10.15). FreeBSD, за замовчуванням, не bashвстановлюється.


shдалеко передує POSIX. Ці дні ви сподіваєтесь, що будь-яке, що shви знайдете, принаймні сумісне з POSIX; але для застарілих систем це далеко не дано. POSIX характеризує набагато більше, ніж оболонку; насправді ви можете стверджувати, що стандартизація викликів операційної системи та функцій бібліотеки важливіша.
трійчатка

Я видалив речі про POSIX, щоб зробити його менш заплутаним
Райан Тейлор

3

/bin/shможе або не може викликати ту саму програму, що і /bin/bash.

shпідтримує принаймні функції, які вимагає POSIX (при умові правильної реалізації). Він також може підтримувати розширення.

bash, "Bourne Again Shell", реалізує функції, необхідні для sh plus bash-розширень. Повний набір розширень занадто довгий, щоб описати тут, і він змінюється в залежності від нових випусків. Відмінності задокументовані у посібнику з Баша. Введіть info bashі прочитайте розділ "Особливості Bash" (розділ 6 у поточній версії) або прочитайте поточну документацію в Інтернеті .


shнадає лише оболонку POSIX, якщо у вас є правильна PATHнастройка у вашій поточній оболонці. Немає визначеного імені PATH, яке дає оболонку POSIX.
schily

Тривалий час, shнеобов'язково, навіть давали вам оболонку POSIX, наприклад, на Solaris.
трійчатка

3

bash і sh - дві різні оболонки. В основному bash - це ш, з більшою кількістю функцій та кращим синтаксисом. Більшість команд працюють однаково, але вони різні. Bash (bash) - одна з багатьох доступних (але найбільш часто використовуваних) оболонок Unix. Bash означає "Bourne Again SHell" і є заміною / удосконаленням оригінальної оболонки Bourne (sh).

Сценарії оболонок - це сценарії в будь-якій оболонці, тоді як Bash - це спеціально для Bash. На практиці, однак, "скрипт оболонки" і "скрипт bash" часто використовуються взаємозамінно, якщо тільки оболонка, про яку йдеться, не є Bash.

Сказавши це, ви повинні зрозуміти, що / bin / sh в більшості систем буде символічним посиланням і не посилатиметься на sh. У Ubuntu / bin / sh використовується для посилання на bash, типову поведінку в дистрибутивах Linux, але тепер змінився на посилання на іншу оболонку під назвою dash. Я би використовував bash, оскільки це майже стандарт (або, принаймні, найпоширеніший з мого досвіду). Насправді проблеми виникають, коли bash-скрипт використовуватиме #! / Bin / sh, тому що виробник сценаріїв передбачає, що посилання є bash, коли цього не повинно бути.


0

Відмінності максимально прості: після основного розуміння, інші коментарі, розміщені вище, буде легше зрозуміти.

Shell - "Shell" - це програма, яка полегшує взаємодію між користувачем та операційною системою (ядром). Існує багато реалізацій оболонок, таких як sh, bash, csh, zsh ... тощо.

Використовуючи будь-яку з програм Shell, ми зможемо виконувати команди, які підтримуються цією програмою оболонки.

Bash - Це походить від B ourne- a посилення Sh ell. Використовуючи цю програму, ми зможемо виконати всі команди, визначені Shell. Також ми зможемо виконати деякі команди, спеціально додані до цієї програми. Bash має відсталу сумісність з sh.

Ш - Це похідне від Bourne Sh ell. "sh" підтримує всі команди, вказані в оболонці. Значить, використовуючи цю програму, ми зможемо виконати всі команди, визначені Shell.

Для отримання додаткової інформації робіть: - https://man.cx/sh - https://man.cx/bash


Щоб зрозуміти POSIX, читати відповідь від Alex ласка , перевірте: stackoverflow.com/a/1780614/1261003
Raihanhbh

Я не намагаюся зрозуміти POSIX. Я переглядаю ваш Відповідь, і як такий мені потрібно бачити, що ваш відповідь додає цінності. Я не думаю, що це робить.
Scratte

Я вважаю, що ці невеликі роз'яснення допоможуть новакові зрозуміти жаргон, який використовується у вищезгаданих дискусіях, зручніше. @Scratte
Raihanhbh

-1

Операційна система Linux пропонує різні типи оболонки. Хоча оболонки мають багато спільних команд, кожен тип має унікальні особливості. Давайте вивчимо різні види в основному використовуваних оболонок.

Шкаралупа:

Шкаралупа Ш також відома як Борн Шелл. Sh shell - це перша оболонка, розроблена для комп'ютерів Unix Стівеном Борном в лабораторії Bell Labs в 1977 році. Вона включає в себе багато інструментів сценаріїв.

Оболонка Баша:

Оболонка Баша означає Борн знову Шелл. Оболонка Bash є оболонкою за замовчуванням у більшості дистрибутивів Linux і замінює Sh Shell (Sh shell також буде працювати в оболонці Bash). Bash Shell може виконувати переважну більшість скриптів оболонки Sh без модифікацій і також надавати функцію редагування рядків команд.


Там був раніше снаряд Кена Томпсона. Оболонка Bourne була офіційно представлена ​​в v7 Unix (1979).
трійка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.