Що означає бути "сумісним"?


63

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

Що означає для оболонки чи іншої програми бути "сумісною"? Що би означало бути "не сумісним"?

Редагувати: Це питання, що задає різницю між bash і sh, є дуже актуальним: Різниця між sh і bash

Я все ще хотів би прямої відповіді на те, що означає бути "ш сумісним". Обґрунтованим сподіванням може бути те, що "сумісний з sh" означає "реалізує мову командної оболонки оболонки", але тоді чому так багато "сумісних" оболонок і чому вони відрізняються?


1
Для сценарію оболонки він посилається на те, використовує чи не, що цей сценарій використовує синтаксис, сумісний (зруйнований) з Bourne Shell ( sh). Для іншої оболонки вона посилається на те, може ця оболонка виконувати сценарії оболонки Bourne чи ні.
HalosGhost

Якщо ви хочете дізнатися , винахідник оболонок ви можете відвідати мій відповідь на unix.stackexchange.com/questions/45684 / ...
Перську затоку

Відповіді:


116

Чому так багато «ш сумісних» снарядів?

Оболонки Борна був першим публічно випущений в 1979 році як частина Unix V7 . Оскільки майже всі Unix та Unix-подібні системи походять від V7 Unix - навіть якщо тільки духовно - оболонка Борна була з нами "назавжди". ¹

Оболонка Борна фактично замінила більш ранню оболонку, перейменовану на оболонку Томпсона , але це сталося так рано в історії Unix, що сьогодні це все, але забуте. Оболонка Борна - це суперсеть шкаралупи Томпсона

Називались і снаряди Борна, і Томпсона sh. Оболонки визначається POSIX також називається sh. Тож, коли хтось каже sh- сумісний, вони рукотворно посилаються на цю серію снарядів. Якби вони хотіли бути конкретними, вони б сказали "оболонка POSIX" або "оболонка Борна"

POSIX оболонки заснований на версії 1 988 KornShell , який , в свою чергу, означало , щоб замінити Bourne Shell на AT & T Unix, перестрибнути в BSD C оболонки з точки зору features.⁴ до такої міри , що kshє предком POSIX оболонки, найбільш У Unix та Unix-подібних системах сьогодні є якийсь варіант оболонки Korn. Виняток - це звичайно крихітні вбудовані системи, які не можуть дозволити собі простір, який займає повна оболонка POSIX.

Однак, оболонка Korn - як річ, відмінна від оболонки POSIX - ніколи не стала популярною поза комерційним світом Unix. Це тому, що його підйом відповідав першим рокам комерціалізації Unix, тому він потрапив у війни у Unix . BSD Unixes відмовився від цього на користь оболонки C, і його вихідний код не був вільно доступний для використання в Linux, коли він почав працювати. вони зазвичай обирають GNU Bash , один із тих sh-сумісних, про які ти говориш.⁶

Ця рання асоціація між Linux та Bash значною мірою запечатала долю багатьох інших оболонок, у тому числі ksh, cshта tcsh. Сьогодні ці снаряди все ще використовують, але вони в меншості .⁷

Вся ця історія пояснює, чому творці відносних запізнювачів люблять bash, zshі yashвирішили зробити їх- shсумісними: сумісність Bourne / POSIX - це мінімум оболонки для Unix-подібних систем, які повинні надати, щоб отримати широке прийняття.

У багатьох системах інтерактивна командна оболонка за замовчуванням і /bin/shце різні речі. /bin/shможе бути:

  • Оригінальна оболонка Борна. Це часто зустрічається у старих системах UNIX®, таких як Solaris 10 (випущений у 2005 році) та його попередниках⁸

  • Оболонка, сертифікована POSIX. Це часто зустрічається в нових системах UNIX®, таких як Solaris 11 (2010).

  • Оболонки Альмквіст . Це клон оболонки Bourne / POSIX оболонки з відкритим кодом, спочатку випущений на Usenet в 1989 році , який потім був внесений в CSRG Берклі для включення в перший реліз BSD, що не містить вихідного коду AT&T, 4.4BSD-Lite . Оболонку Almquist часто називають ash, навіть якщо вона встановлена ​​як /bin/sh.

    4.4BSD-Lite, в свою чергу, став базою для всіх сучасних похідних BSD, /bin/shзалишившись у більшості з них як похідне Almquist, за одним головним винятком, зазначеним нижче. Ви можете побачити це пряме спадання у сховищах вихідного коду для NetBSD та FreeBSD : з першого дня вони доставляли похідну оболонки Almquist.

    За ashмежами світу BSD є два важливі вилки:

    1. dash, відоме як прийняте Debian і Ubuntu в 2006 році як /bin/shреалізація за замовчуванням . (Bash залишається інтерактивною оболонкою команд за замовчуванням у похідних Debian.)

    2. ashКоманди в BusyBox , який часто використовуються у вбудованих дистрибутивах Linux і може бути використана для реалізації /bin/sh. Оскільки він розміщується dashта отриманий із старого ashпакету Debian , я вирішив вважати його похідною, dashа не ash, незважаючи на назву команди в BusyBox.

      (BusyBox також включає в себе менше можливостей альтернативу ashпід назвою hush. Зазвичай тільки один з двох буде вбудований в будь-який даний BusyBox двоичная: ashза замовчуванням, але hush. Коли простір дійсно туго Таким чином, /bin/shв системах на основі BusyBox не завжди dash. -Як)

  • GNU Bash , який вимикає більшість своїх не-POSIX розширень, коли викликається якsh .

    Цей вибір типовий для настільних і серверних варіантів Linux, за винятком Debian та його похідних. Mac OS X також це робив з Panther, випущеного в 2003 році.

  • Оболонка з ksh93розширеннями POSIX , як у OpenBSD . Хоча оболонка OpenBSD змінює поведінку, щоб уникнути синтаксису та семантичної несумісності з оболонками Bourne та POSIX, коли вони викликаються як sh, вона не вимикає будь-які її чисті розширення, будучи тими, що не суперечать старішим оболонкам.

    Це не є загальним; не варто очікувати ksh93функцій в /bin/sh.

Я використав "скрипт оболонки" вище як загальний термін, що означає сценарій оболонки Bourne / POSIX. Це пов’язано з всюдисущими оболонками родини Борн. Щоб говорити про сценарії на інших оболонках, вам потрібно дати класифікатор, наприклад "Сценарій оболонки C". Навіть у системах, де оболонка сімейства C є інтерактивною оболонкою за замовчуванням, краще використовувати оболонку Bourne для сценаріїв.

Це говорить про те, що, коли Вікіпедія класифікує оболонки Unix , вони групують їх у сумісні оболонки Bourne, сумісні з оболонкою C та "інші".

Ця діаграма може допомогти:

Оболонки Unix: родини Bourne, Korn, POSIX, C та rc Shell

(Клацніть на версію SVG, 31 кБ або переглянути повнорозмірну версію PNG , 218 кБ.)

Що би означало бути "не сумісним"?

Хтось, хто говорить про sh-несумісну річ, зазвичай означає одну з трьох речей:

  1. Вони посилаються на один із тих "інших" снарядів. "

  2. Вони роблять різницю між сімействами Bourne та C shell.

  3. Вони говорять про якусь особливість в одній оболонці сімейства Борна, що не є у всіх інших оболонках родини Борна. ksh93, bashі, zshзокрема, мають багато функцій, яких не існує у старих "стандартних" оболонках. Ці троє також багато в чому взаємовигідні, коли ви виходите за межі загальної POSIX / ksh88бази.

Класичною помилкою є написання сценарію оболонки з #!/bin/sh рядком shebang вгорі, але використання розширень оболонок Bash або Korn. Оскільки /bin/shце одна із оболонок в діаграмі сімейства Korn / POSIX на стільки системах в наші дні, такі сценарії працюватимуть над системою, про яку вони написані, але потім виходять з ладу в системах, де /bin/shє щось із ширшої сімейства оболонок Борна. Найкращою практикою є використання рядків #!/bin/bashабо #!/bin/kshshebang, якщо сценарій використовує такі розширення.

Існує багато способів перевірити, чи є переносний сценарій оболонки сімейства Bourne:

  • Запустіть checkbashismsна ньому інструмент проекту Debian, який перевіряє сценарій на " башизми ".

  • Запустіть його під posh, оболонку в сховищі пакетів Debian, яка цілеспрямовано реалізує лише функції, визначені SUS3 , а також кілька інших другорядних функцій .

  • Запустіть його під oshвід проекту Шили Tools , поліпшеної версії оболонки Борна , як з відкритим вихідним кодом від Sun в рамках OpenSolaris в 2005 році, що робить його одним з найпростіших способів отримати 1 979 стиль оболонки Борна на сучасному комп'ютері.

    Дистрибутив Schily Tools також включає boshоболонку типу POSIX з багатьма нестандартними функціями , але це може бути корисно для тестування сумісності скриптів оболонок, призначених для роботи на всіх оболонках сімейства POSIX. Це має тенденцію бути більш консервативними в набір функцій , ніж bash, zshі поліпшених версій ksh93.

    Schily Tools також включає оболонку під назвою bsh, але це історична диваність, яка зовсім не оболонка сім'ї Борна.

  • Пройдіть розділ програмування портативної оболонки в посібнику GNU Autoconf . Ви можете розпізнати деякі проблемні конструкції, про які йдеться у своїх сценаріях.

Чому вони різні?

З тих же причин усі "Нові та вдосконалені!" речі різні:

  • Поліпшену версію можна було покращити лише шляхом порушення зворотної сумісності.

  • Хтось придумав інший спосіб, щоб щось працювало, що їм більше подобається, але це не те, як працював старий.

  • Хтось спробував повторно реалізувати старий стандарт, не розуміючи його повністю, тому вони заплуталися і створили ненавмисну ​​різницю.


Виноски та сторони :

  1. Ранні версії BSD Unix були лише додатковою колекцією програмного забезпечення для V6 Unix. Оскільки оболонка Bourne не була додана в AT&T Unix до V7, BSD технічно не почав мати оболонку Bourne. Відповідь BSD до примітивної природі оболонки Томпсон був Сі - оболонка .

    Проте, перші версії автономна з BSD (2.9BSD і 3BSD) були засновані на V7 або його наступника портативного UNIX / 32V , тому вони зробили включати оболонку Борна.

    (Лінія 2BSD перетворилася на паралельну вилку BSD для міні-комп’ютерів PDP Digital , в той час як лінії 3BSD і 4BSD продовжували користуватися новими типами комп'ютерів, такими як робочі станції Vaxen і Unix . 2.9BSD був по суті PDP-версією 4.1cBSD; вони були сучасники, і загальний код . ПРП не просто зникає , коли VAX прибув, так що 2BSD лінія ще Shambling разом .)

    Можна з упевненістю сказати, що оболонка Борна була всюди в світі Unix до 1983 року. Це гарне наближення до "назавжди" в обчислювальній галузі. Того року MS-DOS отримав ієрархічну файлову систему (awww, як cuuute!), А перший 24-розрядний Macintosh із 9-дюймовим екраном B&W - не сірим кольором , буквально чорно - білим - не з'явиться до початку наступного року.

  2. Шкаралупа Томпсона була досить примітивною за сьогоднішніми мірками. Ми очікували це лише інтерактивна командна оболонка, а не середовище програмування скриптів. У нього були такі речі, як труби та перенаправлення вводу / виводу, які ми вважаємо прототипними частинами "оболонки Unix", так що ми думаємо про командну оболонку MS-DOS як отримання їх від Unix.

    Bourne оболонка також замінити ПРБ оболонку , яка додала важливі речі оболонки Томпсона , як программируемость ( if, switchі while) і ранню форму змінних оточення. Оболонка PWB навіть менш добре запам'ятовується, ніж оболонка Томпсона, оскільки вона не була частиною кожної версії Unix.

  3. Коли хтось не конкретний щодо сумісності оболонок POSIX проти Bourne, існує цілий спектр речей, які вони можуть означати.

    З одного боку, вони могли використовувати оболонку Борна 1979 року як основну лінію. « sh-Сумісний сценарій» в цьому сенсі означає, що , як очікується, прекрасно працювати на істинної оболонці Bourne або будь-якому з його спадкоємців і клонів: ash, bash, ksh, zshі т.д.

    Хтось з іншого крайнього місця замість цього приймає оболонку, вказану POSIX. У наші дні ми приймаємо так багато функцій оболонки POSIX як "стандартні", що ми часто забуваємо, що їх фактично не було в оболонці Bourne: вбудована арифметика, контроль роботи, історія команд, псевдоніми, редагування командного рядка, $()форма команди підміна тощо.

  4. Хоча оболонка Korn має коріння ще на початку 1980-х, AT&T не доставляв її в Unix до випуску System V, випуску 4 в 1988 році. Оскільки так багато комерційних Unixes базуються на SVR4, це вкладається kshу майже всі відповідні комерційні Unix з кінець 1980-х років.

    (Кілька дивних ароматів Unix на основі SVR3 і раніше трималися на шматочках ринку після виходу SVR4, але вони були першими біля стіни, коли відбулася революція .)

    1988 рік - це також рік, коли з'явився перший стандарт POSIX , на базі якого використовується корпус Korn - "оболонка POSIX". Пізніше, у 1993 році, вийшла вдосконалена версія оболонки Корна. Оскільки POSIX фактично прибив оригінал на місце, kshроздвоєний на дві основні версії: ksh88і ksh93, названий на честь років, які брали участь у їх розколенні.

    ksh88не повністю сумісний з POSIX, хоча відмінності невеликі, тому деякі версії ksh88оболонки були виправлені на POSIX-сумісність. (Це з цікавого інтерв'ю на Slashdot з доктором Девідом Г. Корном . Так, хлопець, який написав оболонку.)

    ksh93є повністю сумісним набором оболонки POSIX . Розвиток в Інтернеті ksh93носить епізодичний характер, оскільки сховище первинних джерел перейшло з AT&T в GitHub, а останньому випуску було близько 3 років, як я пишу це, ksh93v. (Основна назва проекту залишається ksh93суфіксами, доданими для позначення версій версій після 1993 року.)

    Системи, що включають оболонку Korn як окрему річ від оболонки POSIX, зазвичай роблять її доступною як /bin/ksh, хоча іноді вона ховається в іншому місці.

    Коли ми говоримо про kshабо оболонку Корна за назвою, ми говоримо про ksh93особливості, які відрізняють її від сумісних назад підмножин Bourne та POSIX оболонок. Ти рідко сьогодні перебігаєш чисте ksh88.

  5. AT&T зберігав вихідний код оболонки Korn до березня 2000 року . На той момент асоціація Linux з GNU Bash була дуже сильною. Bash і ksh93 кожен мають переваги перед іншими , але на даний момент інерція тримає Linux тісно пов'язаний з Bash.

    Щодо того, чому перші постачальники Linux найчастіше обирають GNU Bash over pdksh, який був доступний на момент запуску Linux, я думаю, це тому, що значна частина решти користувачів також походить від проекту GNU . Bash також дещо досконаліший pdksh, оскільки розробники Bash не обмежуються копіюванням функцій оболонки Korn.

    Робота над pdkshзупинилася приблизно на той час, коли AT&T випустила вихідний код до справжньої оболонки Korn. Однак існують два основні вилки: OpenBSD pdkshта KorBS Shell MirBSDmksh .

    Мені здається цікавим, що mkshце єдина реалізація оболонки Korn, яка наразі упакована для Cygwin.

  6. GNU Bash багато в чому виходить за рамки POSIX, але ви можете попросити його працювати в більш чистому режимі POSIX .

  7. csh/ tcshзазвичай була інтерактивною оболонкою за замовчуванням на BSD Unixes на початку 1990-х.

    Будучи варіантом BSD , ранні версії Mac OS X проходили саме так, через Mac OS X 10.2 "Jaguar" . OS X переключила оболонку за замовчуванням з tcshBash в OS X 10.3 "Panther" . Ця зміна не вплинула на системи, оновлені з 10.2 або раніше. Існуючі користувачі цих перетворених систем зберігали tcshоболонку.

    FreeBSD стверджує, що як і раніше використовується tcshяк оболонка за замовчуванням , але у FreeBSD 10 VM, який я тут маю, оболонка за замовчуванням є одним із варіантів оболонки Almquist, сумісної з POSIX . Це стосується і NetBSD.

    OpenBSD використовує вилку pdkshяк оболонку за замовчуванням.

    Більш висока популярність Linux та OS X змушує деяких людей бажати, щоб FreeBSD також перейшов на Bash, але вони цього не зроблять незабаром з філософських причин . Його легко переключити , якщо це вас турбує.

  8. Рідко можна зустріти систему із справді ванільною оболонкою Борна, як /bin/shсьогодні. Вам доведеться вийти зі свого шляху, щоб знайти щось досить близьке до нього для тестування на сумісність.

    Мені відомо лише один спосіб запустити справжню вінтажну оболонку Борна 1979 року на сучасному комп’ютері: використовувати дискові зображення Ancient Unix V7 за допомогою симулятора SIMH PDP-11 із проектування моделювання історії комп’ютерів . SIMH працює майже на кожному сучасному комп'ютері , а не тільки на Unix. SIMH працює навіть на Android та iOS .

    У OpenSolaris компанія Sun вперше відкрила версію оболонки Bourne SVR4. До цього вихідний код для версій оболонки Bourne після V7 був доступний лише тим, хто має ліцензію на вихідний код Unix.

    Цей код тепер доступний окремо від решти неіснуючого проекту OpenSolaris з декількох різних джерел.

    Найбільш прямим джерелом є проект оболонки Heirloom Bourne . Це стало доступним незабаром після оригінального випуску OpenSolaris 2005 року. Деяка робота з портативності та виправлення помилок була виконана протягом наступних кількох місяців, але потім розвиток проекту зупинився.

    Йорг Шиллінг зробив кращу роботу з підтримання версії цього коду, як oshу своєму пакеті інструментів Schily . Детальніше про це див. Вище.

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

    Один із способів визначити, чи є ви в оригінальній оболонці Bourne, - це перевірити, чи підтримує він незадокументовану функцію, додану для полегшення переходу від оболонки Томпсона: ^як псевдонім для |. Тобто така команда, як ls ^ moreпомилка, призведе до помилки в оболонці типу Korn або POSIX, але вона буде вести себе як ls | moreу справжній оболонці Bourne.

  9. Іноді ви зіткнулися fish, scshабо rc/esприхильник, але вони ще рідше , ніж шанувальники C оболонки.

    rcСімейство оболонок зазвичай не використовується в системах Unix / Linux, але сім'я є історично важливим, що , як він отримав місце в діаграмі вище. rcє стандартною оболонкою операційної системи Plan 9 від операційної системи Bell Labs , свого роду спадкоємцем 10-го видання Unix , створеного як частина постійних досліджень Bell Labs щодо проектування операційної системи. Він несумісний з оболонкою Bourne та C на рівні програмування; там, мабуть, є урок.

    Найбільш активним варіантом rcз'являється той, який підтримує Тобі Гудвін , який базується на rcклоні Unix Байрона Ракіціса.


Якщо ви хочете дізнатися більше стосунків, наприклад, з командою UNOS, "bsh" та недавнім Борном Шеллом, надішліть мені записку. Як натяк: команда UNOS мала вбудовану команду "do", яка діяла як однолінійний сценарій оболонки з аргументами. Ця ідея була передана в оболонці Борна як "dosh" і дозволяє параметризувати псевдоніми, те, що ви не можете отримати з ksh або bash.
schily

Можливо, варто відзначити, що сам pdksh заснований на оболонці Форсайта. В основному забутий сьогодні, але він має деяке історичне значення в спадщині pdksh, але також, оскільки він був оболонкою деяких версій minix і був перенесений в msdos.
Стефан Шазелас

25

"sh сумісний" позначає POSIXsh , основну оболонку, яка необхідна для існування у всіх сумісних системах. Sh-сумісний сценарій повинен працювати на будь-якому сумісному POSIX пристрої.

Причина, по якій необхідно сказати , так це те , що зазвичай /bin/shє символічною посиланням /bin/bash, яка випустила кілька Bashisms прослизнути в сценарії , які декларують себе використовувати shз #!/bin/sh. Ці сценарії не спрацьовують у системах, які не використовують bashяк /bin/sh, включаючи деякі комерційні Unices назавжди, а також Debian та деривативи останнім часом.

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

Різні оболонки мають власну історію розвитку та розходяться в різних напрямках у часі, оскільки вони додавали функції для інтерактивного використання для своїх користувачів або розширення сценаріїв, як асоціативні масиви. Скрипт "sh-несумісний" використовував би деякі з цих нестандартних функцій розширення, як-от [[умовні умови Баша .

Функції, які не є POSIX, у bashта tcshта zshта в усіх інших поточних оболонках є корисними , і є безліч випадків, коли вони можуть вам потрібні чи потрібні. Вони просто не повинні використовуватися в сценарії, який заявляє про себе /bin/sh, оскільки ви не можете покладатися на ті функції, які знаходяться в базовій shреалізації системи, на якій ви працюєте.

Сценарій, у якому потрібно використовувати, скажімо, асоціативні масиви, повинен забезпечити його запуск, bashа не sh:

#!/bin/bash
declare -A array

Це буде працювати де завгодно bash. Сценарії, які не потребують розширеного функціоналу і призначені для переносу, повинні заявляти, що вони використовують shі дотримуються основної мови командної оболонки.

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