Найбільш універсальною мовою сценаріїв для Linux є?


24

Ми пишемо сценарії для систем Linux, дебати про те, що було б найбільш універсальною мовою сценаріїв для Linux. Bash, SH, Posix? Що?


3
Я б здогадався sh.
Блендер

Чи є у вас перелік цільових дистрибутивів? Або обов'язкові / бажані дистрибуції, на яких він повинен працювати?

4
"ш"? Що "ш"? Оболонка Томсона? оболонка Борна? bash, ksh, pdksh, ash, zsh як знайдено як /bin/shу системі X чи Y ? Специфікація POSIX sh, специфікація SUSv3, SUSv4 sh, специфікація LSB sh? "sh" сам по собі нічого не означає.
Стефан Шазелас

1
якщо це стосується побудови та встановлення програмного забезпечення сценаріїв, ви можете перевірити Autotools, який намагається вирішити проблеми міжкомплектної компіляції.
Лі Лі Райан

1
@sch Найбільш портативне загальне перехрестя, "очевидно". Якщо люди, незнайомі зі оболонками Unix, потрапляють в оману вашим коментарем, специфіка POSIX реалізована майже всіма сучасними оболонками, які наважуються назвати назву sh, і невідповідними sh, які не є давніми і рідкісними в даний час (наприклад, Борн). Можна зіткнути постійно зростаючий список розширень та варіацій, але якщо мета "універсальна" чи портативність, слід йти у зворотному напрямку. Відповідь Жиля більш детально висвітлює деталі.
jw013

Відповіді:


38

Існує два середовища програмування, які доступні в будь-якій операційній системі, схожій на Unix, які є Turing-повними і здатні викликати інші програми: awk і sh , сімейство оболонок Bourne / POSIX. AWK орієнтована на обробку тексту (вона доповнює більш спеціалізовані утиліти), в той час як sh орієнтована на те, щоб бути мовою клею для складання програм. Ш. є універсальною мовою сценаріїв на Linux і в усьому світі UNIX.

Стандарт POSIX визначає обов'язкові функції самого sh та пов'язаних з ними утиліт. Більшість схожих на unix систем відповідають POSIX 1003.1-2004 (він же Single Unix v3, відомий також як специфікація Open Base Open 6); остання версія цього стандарту - POSIX 1003.1-2008 (він же Single Unix v4, відомий також із випуску 7 для базової групи Open Group).

Кожна система Linux і unix або Unix має на шляху шлях оболонки у стилі Борна /bin/sh, а будь-яка не антикварна система має оболонку, сумісну з POSIX (заборона випадкових помилок). Кожна сучасна система, схожа на Unix (включаючи Linux), підтримує шебаги , тому вона автоматично запускає сценарії, /bin/shякщо є перший рядок #!/bin/sh. Існують системи POSIX, де shвони розташовані в іншому місці (як правило, шари емуляції на ОС, які ви б не вважали справді схожими на Unix).

Вбудовані системи Linux можуть мати збиту систему BusyBox , яка не реалізує всі функції POSIX. BusyBox має велику кількість варіантів часу компіляції для розміщення систем малої площі, тому важко знати, чого очікувати заздалегідь, вам доведеться налаштувати свої сценарії до певного пристрою. BusyBox - це найпоширеніша реалізація малофункціональних програм та програмних засобів; Ще один варіант, з яким ви можете зіткнутися, - це надзвичайно скорочене середовище оболонки в Android (пізніші версії менш анемічні).

Non-вбудовані системи Linux майже завжди мають або тир або Баш як /bin/sh. Dash - це невелика і швидка оболонка, яка реалізує трохи більше функцій POSIX. Bash - більша оболонка з більшою кількістю функцій.

Без вбудованих систем Linux майже завжди встановлено Bash як /bin/bash. Отже, для портативності в невбудованих системах Linux можна припустити, що bash доступний. Серед корисних додаткових функцій bash - це масиви, можливість зручного впорання з крапковими файлами, pipestatusзмінна для отримання статусу повернення всіх команд у конвеєрі, додаткові оператори порівняння часу файлу та (в останніх версіях) регулярне узгодження виразів .

Однією з особливостей програмування оболонок є те, що ви використовуєте не просто shпрограму, а також використовуєте ряд утиліт . Більшість утилітів для обробки файлів та обробки тексту в Linux є основними програмами GNU (у вбудованих системах вони зазвичай є від BusyBox).

Якщо вам потрібна портативність за межами Linux, найкраще ставитись до POSIX. В інших варіантах unix можливо не встановлено bash (bash є частиною стандартної установки на OSX, але необов'язковий пакет на * BSD та більшість комерційних уніцій). Практично всі варіанти Unix, окрім Linux та OSX (тобто * BSD та комерційні об'єднання), мають певну версію оболонки Korn , принаймні pdksh . Багато зручних розширень bash походять від ksh, тому може бути корисним написання сценаріїв, які можуть працювати під обома, але виявити, де bash або ksh знаходиться у невідомій системі, може бути біль.

Оболонка не може все. Якщо вам потрібна більш досконала мова, ще два поширені варіанти - Perl та Python (все інше значно відстає від мови сценаріїв Unix). Perl є традиційною мовою сценаріїв, і мало хто з вбудованих Linux-систем не вистачає цього, але Python набирає позиції (посилюється частково тим, що є рекомендованою мовою сценаріїв для Ubuntu). У світі, що не є Linux, Perl є частиною базової установки на OSX та OpenBSD; це необов'язково, але дуже часто встановлюється на FreeBSD і необов'язково, але часто встановлюється на NetBSD.


1
"частково підсилений ..." Це і є все-таки необхідним у системах Fedora та RHEL.
Ігнасіо Васкес-Абрамс

В основному з усім цим згодні. Просто декілька різних акцентів: * деякі дистрибутиви базуються на BusyBox, але не обов'язково вбудовуються (я використовую один, Alpine). (Звичайно, відповідь дійсно говорять «майже завжди».) * BSDs є великий клас Unix-подібних систем , в яких ви не можете припустити , Баш за замовчуванням. * тире вміє робити майже все, що може, просто інколи вимагає більше уваги. * Якщо вам потрібна більш досконала мова, так, Perl і Python - це найпоширеніший вибір, але awk ще більш поширений і є адекватним для багатьох цілей. Це також зазвичай недооцінюється. Але він легший за вагу, ніж Perl і Python.
сумнівний

2
Хоча справедливе попередження - FreeBSD викинув Perl зі своєї встановленої за замовчуванням деякого часу тому. Крім цього, я не знаю жодного іншого дистрибутива, який не має Perl в базовій установці.
TC1

@ TC1 Perl завжди був необов’язковим у NetBSD. Він знаходиться в базовій системі на OpenBSD.
Жил "ТАК - перестань бути злим"

@dubiousjim Тільки Linux (не вбудований або на практиці достатньо хороший наближення) та OSX мають башти у встановленій програмою за замовчуванням; * BSD мають pdksh або mksh, а комерційні об'єднання мають ATT ksh.
Жил "ТАК - перестань бути злим"

11

У порядку наявності:

  1. sh, але дотримуйтесь визначених POSIX засобів.
  2. bash, але не забудьте чітко вказати це в shebang, або ви можете замість цього отримати тире.
  3. Пітон. Майже кожен ним користується.
  4. Perl Але ви отримуєте це написати.

Після цього нікого насправді не хвилює, оскільки з цим ти не можеш багато зробити.


10
Я поставив би PERL перед python, він встановлений за замовчуванням у більшості систем Linux.
тердон

4
Perl - №3. І ти дістанешся написати це, бонус! :)
Warren Young

2
Я погоджуюся з @ignacio perl є №4, а python - №3. Причина очевидна. Я думаю, що Python - це еволюція perl.
bagavadhar

5
@ashwin: ні, пітон - це не еволюція, а то і подібне перла. perl - це мова sysadmins для sysadmins. python - це мова програмістів для програмістів. Ця різниця є вирішальною. Вони обидва використовують, і хоча у випадках використання може бути багато перекриттів, для одних завдань кращий вибір perl, а для інших python явно перевершує.
cas

1
Ruby і PHP надихнули Perl. Пітон є результатом фізичного експерименту, в якому вони створили антиперлі в суперколадері. (У мене немає нічого проти Python. Плюси і мінуси, плюси і мінуси.)
Warren Young

4

Як правило, я б сказав sh.... але, оскільки ви вказали Linux, я скажу bash- це гарантовано є у всіх системах Linux навколо (ну, виключаючи незрозумілі педантично-крихітні, які фетишизують мінімалізм :).

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

Після bashsh) наступною найбільш "універсальною" мовою сценаріїв для Linux буде якийсь діалект awk- зазвичай mawkабо gawk. Якщо ви дотримуєтесь простого awk і уникаєте гаукізмів, ваш сценарій повинен спрацьовувати майже на будь-якій системі Linux (він може бути відсутнім у крихітних дистрибутивах чи вбудованих пристроях). Більшість систем Linux матимуть mawkі gawkнаявні, і доступні, але в деяких дистрибутивах (наприклад, debian) mawkвстановлено за замовчуванням, і вам доведеться встановлювати gawkсебе, якщо цього хочете.

Далі буде perl. AFAIK, основна мова perl встановлюється за замовчуванням у всіх поширених дистрибутивах Linux, так що це робить хорошим вибором. Навіть більше, на щастя, є дуже мало несумісності версій з версіями perl5 (хоча perl 5.12 або це, можливо, було 5.14 нарешті, обійшлося, щоб видалити деякі незрозумілі функції, які були застаріли протягом приблизно 15 років ... достатньо попередження не використовувати їх) якщо ваш стиль кодування по-справжньому дивний, і ви не хочете ігнорувати понад десятиліття попередження "не робіть цього", ваші сценарії Perl працюватимуть чудово майже де завгодно. Мова є надійним і потужним , і може робити все , що awkі sedможе зробити , і багато іншого. З невеликим зусиллям можна робити те, щоshтрадиційно добре також (наприклад, запуск зовнішніх команд та використання / підключення виводу). Стандартні бібліотеки Perl теж досить вичерпні - охоплюють більше, ніж просто основи.

Єдина спіймана програма perl полягає в тому, що існує також величезна бібліотека модулів CPAN, яка дозволяє робити все, що ви можете придумати (і багато іншого, що вам ніколи не трапляється) - і не всі вони будуть доступні в кожній системі з Perl . Зазвичай вони дуже високої якості, тому легко ввійти в звичку просто користуватися ними, але якщо ви все-таки користуєтесь ними, вам доведеться переконатися, що вони встановлені. Багато модулів CPAN попередньо упаковані для Linux, а решта легко встановлюються за допомогою інструмента cpan (або dh-make-perlна debian / ubuntu / тощо, щоб перетворити модуль CPAN в пакет .deb)

Я б хотів сказати pythonдалі, але я справді не можу. Про python дуже багато подобається, але він не включений за замовчуванням у багатьох системах Linux, і, чесно кажучи, його сумісність з версіями (як для самого python, так і його нібито «стандартних» ліб) - це суцільна проблема. Деякі дистрибуції докладають великих зусиль, щоб розібратися в безладі, а деякі ні. Не допомагає і той факт, що python - це в основному мова, написана для програмістів програмістами (на відміну від sysadmins), і вони, здається, не думають, що система, на яку буде встановлений код, взагалі важлива .... їх код насправді супер особливий, тому їм не потрібно займатися нудними речами, такими як інтеграція в існуючі системи.

(Не розумію тут мого сарказму - я дуже люблю python як мову, я просто ненавиджу факт, що управління версіями та залежностями є ПДТА. Це як би повернутися 20+ років до епохи ручного полювання на незрозуміле. біти коду та патчі, щоб отримати щось складене та запущене у вашому фірмовому * nix)


Я знаю, що це стара публікація, але найкращий спосіб обійти це - вказати версію в шебангу (наприклад /usr/bin/python2, /usr/bin/python3).
Isiah Meadows

1

Я б запропонував слідувати ksh93 або навіть POSIX смаку, і ви завжди можете використовувати bash / zsh для запуску.

А дистрибутив на основі Debian використовує mawk not gawk як стандартний awk. Так що, уникайте додаткових доповнень, оскільки mawk - це швидше.


0

Не баш. Напишіть на близький до POSIX такий, як тире або попіл. Це буде найбільш універсальним. Я не думаю, що є ще щось, що навіть є близьким конкурентом. (І це мені здається фактичним питанням, а не "думкою", як скаржиться один із коментаторів.)

Якщо вам потрібно щось трохи потужніше, ніж sh (наприклад, якщо ви хочете реальних асоціативних масивів), використовуйте awk. (Уникаючи розширень gawk. Існує багато версій awk, але в основному є спільне ядро.) Це повинно бути доступне майже так само широко, як і sh.


1
awk-on-Linux є загальноприйнятим; Я не можу придумати жодного дистрибутива, який має за замовчуванням інший варіант.
Ігнасіо Васкес-Абрамс

5
Які варіанти Linux не підтримують bash?
Джонатан Леффлер

1
Безумовно, bashможна встановити та запустити на (майже) будь-якому вікні Linux, але багато користувачів debian встановлюватимуть лише dashі вважають за краще не встановлювати bash.
Вільям Перселл

6
@WilliamPursell Пакет bash позначений Essential на Debian (тобто для видалення вам доведеться пройти обручі з достатньою попередженням, що це призведе до шлангу вашої системи). Bash якраз і є універсальним для невбудованих систем Linux.
Жил "ТАК - перестань бути злим"

1
@JonathanLeffler: Вбудовані, навпаки, можуть мати лише Busybox.
Механічний равлик

0

Я б сказав, що доступність буде десь у цьому порядку:

  1. ш
  2. awk
  3. Perl (я ще не бачив * nix без нього, включаючи BSD)

Хоча Python здається гарною мовою, я не використовував жодної ОС, яка постачалася з ним у базовій установці, хоча, мабуть, Ubuntu, можливо?


0

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

Іншою нотою, якби я був ти, я також вважав би мету, яку хочу досягти за сценаріями. Кожен інструмент має свої достоїнства та недоліки. Тож, хоча я широко використовую Python, я не буду користуватися цим у кожному випадку.

Я можу придумати кілька сценаріїв і згадати деякі корисні для них інструменти.

Файли FTP туди-сюди; обробляти їх; надсилати сповіщення електронною поштою; і так далі

У цьому випадку було б краще дотримуватися оболонки (наприклад, Bash) і використовувати різні утиліти (наприклад ftp, cronі mail). Це типовий випадок використання у багатьох великих компаніях.

Швидка обробка тексту

Ще раз оболонка. Утиліти подобається grep, awk, sed, pasteта інші дуже зручні в цьому випадку.

Побудувати

У домені C / C ++ універсальним інструментом для цього є make. Світ Java вважає за краще Apache ANT.

Розгортання та дистанційне управління

Або оболонку, або Python. Наприклад, scpі rsync, відповідно, було б досить корисно при копіюванні файлів або синхронізації файлів.

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

(Зверніть увагу, що наведені вище пропозиції не зосереджені на особливостях оболонки , а на різних доступних утилітах.)


-1

Perl не знаходиться у базі FreeBSD, NetBSD чи DragonflyBSD, вибачте. OpenBSD має Perl в базовій установці. На сьогодні OS X є сертифікованим UNIX, і його можна розглядати як певний варіант BSD на якомусь рівні, і він має Perl, Python та Ruby в основі.

Багато фірмових UNIXen не мають Perl в своїй базі, наприклад, Solaris, AFAIK, ні HP-UX, ні IBM AIX теж ...


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