Чи сценарій bash такий же, як сценарій оболонки?


58

Я дуже новачок у Ubuntu. Я чую, як люди кажуть «сценарій оболонки», «скрипт».

Цікаво, вони однакові? Або вони різні?


Є корисна відповідь на SO
Містер Пей

Відповіді:


55

Bash ( bash) - одна з багатьох доступних (але найбільш часто використовуваних) оболонок Unix. Bash означає " B ourne A посилення SH ell" і є заміною / удосконаленням оригінальної оболонки Bourne ( sh).

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

EDIT: Насправді оболонка сценарію за замовчуванням в Ubuntu - тире, тоді як інтерактивна оболонка за замовчуванням (що ви отримаєте, якщо ви підтягнете термінал) - Bash. Тим не менш, два терміни все ще переважно взаємозамінні.


1
Що визначає тире як оболонку сценарію за замовчуванням?
wjandrea

1
@wjandrea Той факт, що /bin/shпосилання на символьне посилання /bin/dashробить системною оболонкою за замовчуванням , але це не оболонка сценаріїв за замовчуванням , тобто немає жодного письмового правила, яке ви абсолютно повинні використовувати /bin/sh. Якщо ви користуєтеся /bin/shцим, насамперед, з міркувань портативності, коли ви очікуєте, що ваш сценарій буде використовуватися на декількох платформах, схожих на Unix, більшість з яких мають /bin/shсумісну з POSIX оболонку сімейства Bourne.
Сергій Колодяжний

29

Вступ

Сценарії Bashоболонок та сценарії - це не одне і те ж, тому що існують інші оболонки, такі, shякі можуть бути використані для виконання сценарію; скрипт, призначений для виконання, Bashповинен бути позначений як Bashсценарій. Терміни часто використовуються як взаємозамінні, оскільки Bash, завдяки своїй розширеній функціональності в порівнянні з sh, це найчастіше використовується для виконання сценаріїв користувачів у багатьох дистрибутивах. Тим НЕ менше, існують і інші оболонки , такі як Korn (ksh), C shell (csh)і Z shell (zsh), але ми не будемо вдаватися в них тут , як обговорення shі bashмає саме безпосереднє відношення до Ubuntu. Чудова стаття IBM тут детальніше описує еволюцію оболонок в Linux і добре описує архітектуру оболонок та те, як оболонки відрізняються.

Сценарій оболонок

Shбула оригінальна оболонка Unix, розроблена Стівеном Борном; проте системи на базі Debian і Ubuntu вважають dashїх shоболонкою ( shнасправді вона посилається на dash). У Debian і Ubuntu, через швидкість sh, він частіше використовується для критичних системних процедур та для виконання ключових скриптів при запуску; Детальніше дивіться у вікі Ubuntu . Bashвиступає за Bourne Again SHell і був розроблений пізніше Брайаном Фоксом і значно розширив оригінал sh. Розвиток Фокса та інших людей Bashбуло важливою частиною проекту GNU. Дивіться цю чудову дискусію історії Bashдля отримання додаткової інформації.

Важливо зауважити, що обидва shі Bash, як використовується в Ubuntu та інших дистрибутивах, POSIXсумісні, що означає, що вони підписані на ряд стандартів про те, як виконуються команди в Shell. Це робиться для того, щоб результати сценаріїв, використовуваних в ОС, можна було надійно прогнозувати, і що поведінка оболонки може зберігатися в межах цих POSIXпараметрів, як це особливо важливо для розробників. Більш детальну інформацію про стандарти див. В офіційній документації .

Часто сценарії оболонки мають суфікс .sh, навіть якщо вони призначені для виконання у вигляді bashсценаріїв і мають #!/bin/bashу верхній частині сценарію. Насправді не має значення, називається сценарій script.sh чи my.script , важливо, чи є виклик інтерпретатору /bin/shчи /bin/bash. Сценарії оболонки можна також викликати в командному рядку або з shабо bash.

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

Ресурси для сценаріїв Bash Shell

Інколи важко знайти корисні ресурси в Інтернеті, які слідкують за хорошою практикою та дають поради, які дозволять створити корисні сценарії. Після цього man bash, деякі з найважливіших ресурсів - вікі Грега , хакери Баша та недавня книга Стіва Паркера про сценарії Shell, яка зосереджується в основному на Bashі опублікована O'Reilly. Гарне вступ також проводиться в Посібнику для початківців Баша .


2
Ця відповідь насправді перевершує мою (прийняту відповідь), моя щойно прийшла за тиждень до цієї.
Хілтон Шумвей

4

Є кілька оболонок , доступних для Ubuntu, як bash, zsh, ksh, tcshі csh.

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


2
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29 11:53 /bin/sh -> dash*
$ ls -l /bin/dash
-rwxr-xr-x 1 root root 109768 Mar 29 11:53 /bin/dash*
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024 Apr  3 08:58 /bin/bash*

Це показує, що 'sh' є символьним посиланням на 'dash', і що / bin / bash, що є інтерактивною оболонкою за замовчуванням в Ubuntu, є виконуваним файлом, який майже в 9 разів більший за / bin / sh.

Дійсно, "man sh" (1590 рядків) vs "man bash" (5459 рядків) виявляє, що bash - це велика сукупність традиційного "sh".

Детальніше читайте тут:


2

Скрипт оболонки визначатиметься як орієнтований на портативність сценарій, який може управляти системною оболонкою ОС, сумісних з POSIX. Синтаксис буде ідентичним або подібним із синтаксисом мови сценаріїв оболонок, визначеним стандартом POSIX. Це стандарт для більшості сумісних ОС POSIX, таких як Linux / Unix / * BSD тощо. POSIX є найпоширенішим підґрунтям для сумісності в операційних системах.

Різні ОС із вищезазначеного реалізують різні оболонки для неінтерактивного використання (тобто для виконання системних сценаріїв або сценаріїв, що використовують #! /bin/shshebang), які, крім реалізації команд та синтаксису POSIX, мають власні розширення або, можливо, можуть бути позбавлені деяких менш корисних функцій з міркувань продуктивності, але обробка POSIX дозволяє забезпечити дуже високий рівень переносимості сценаріїв, розроблених для різних сумісних з POSIX сумісних даних.

Більшість згаданих ОС мають окрему інтерактивну оболонку, яка зазвичай є повнофункціональним башем . Bash значною мірою сумісний з POSIX, але також має великий набір додаткових команд і підтримує різні синтаксиси. Запуск Bash з параметром командного рядка --posix або виконання "set -o posix" під час запуску Bash призведе до того, що Bash більше відповідатиме стандарту POSIX, змінивши поведінку на відповідну POSIX у областях, де Bash за замовчуванням відрізняється, див. https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html

Специфікатор Shebang та уніфіковані контури для виконуваних файлів оболонок на Unix-подібних ОС

Завдяки єдиним правилам розміщення виконуваних файлів для оболонок (вони зазвичай знаходяться в каталозі '/ bin /'), ми можемо мати єдині правила для створення скриптів оболонок, точніше, нам зрозуміло, який шлях слід прокласти в виразі shebang, щоб вказати на належний виконуваний оболонку для запуску сценарію. Файлові системи Unix / Linux / * BSD не підтримують розширення внутрішньо, тому розширення файлів служать лише додатковою підказкою або для індексування.

Спеціально для Debian / Ubuntu bin/sh- це символьне посилання, яке вказує на bin/dashвиконуваний оболонку тире . Це робить тире системної оболонки, яка, за оцінками, в 4 рази швидша і на розмір ~ 1/10, ніж більш функціональна баш. джерело: https://unix.stackexchange.com/questions/148035/is-dash-or-some-other-shell-faster-than-bash

Debian / Ubuntu інтерактивний термінал за замовчуванням, як і в багатьох інших Unix-подібних операційних систем, Баш, для яких шлях також нерівномірний: /bin/bash.

Стандарт POSIX.1-2017: http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html

Загальним правилом було б:

Якщо команда або опція не визначена POSIX, то не ставте її в #! /bin/shсценарій в першу чергу.

Перетворіть свій скрипт або перевірте на наявність помилок

Для перетворення сценарію з bash у POSIX форму, можливо, ви хочете автоматично перевірити наявність помилок у вашому скрипті оболонки або побачити, які зміни у вашому скрипті bash слід зробити, щоб зробити POSIX сумісним:

https://www.shellcheck.net/

http://mywiki.wooledge.org/ башизм


1
Дуже гарна відповідь, +1. Ласкаво просимо до AskUbuntu!
Сергій Колодяжний

1
Що стосується Dash як / bin / sh на ubuntu, то там є стаття, яку ви також можете процитувати. А ще є askubuntu.com/q/976485/295286
Сергій Колодяжний,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.