Коли важливо писати портативні сценарії?


18

Більшість кодів, які я пишу, є в PHP. Нещодавно я почав вивчати сценарії оболонок. Більшість ресурсів та навчальних посібників, які я натрапила, стосуються Баша. Деякі попереджають про башизми, а деякі ні. Я багато читав тут і Stack Overflow.

Щоразу, коли у відповіді використовуються башизми , хтось неминуче коментує, щоб сказати:

Не слід використовувати <вставте сюди башизм>. Це не портативно.

Це трапляється навіть тоді, коли питання було позначене тегом bash. Для мене це як сказати програмісту PHP, що вони не повинні використовувати новий код у PHP 5, оскільки він не може бути використаний з PHP 4. Або сказати комусь, що він не повинен щось писати для Mac, оскільки його не можна використовувати на Windows.

Коли я пишу на PHP, я вибираю мінімальну вимогу і пишу код, сумісний вперед . Я не переживаю, щоб зробити це назад- сумісним.

Якщо я використовую #!/bin/bashяк шебанг, чому я не повинен використовувати башизми? Я починаю , щоб отримати враження , що деякі люди просто люблять Баш bashisms (каламбур) тільки заради цього.

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

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

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

Отже, коли важливо писати портативні сценарії?

Наприклад,

  • які сценарії повинні бути максимально портативними?
  • наскільки поширені системи, на яких не встановлено Bash?
  • якщо в системі встановлено Bash, чи буде вона також мати GNU версію пошуку та інших утиліт?

4
Я підтримав це питання і відповів на нього, але чим більше я думаю про це, лише два останні питання відповідають сайту. Інші - "в першу чергу на основі думки".
Йорданм

1
У цьому питанні є і мета-аспект: Хоча це може не допомогти на початкову відповідь на запитання, коментарі на кшталт "це не переносимо" можуть бути дуже корисними для інших читачів, що натрапляють на питання / відповідь через місяць чи роки.
Bananguin

2
@Bananguin Коментарі, які говорять "це не портативно", не турбуйте мене. Це просто вигадка. Я робив такі типи коментарів сам. Мене турбує саме "Ти не повинен використовувати ...". Це означає, що у відповіді щось не так. Це було б справедливо, якби відповідь рекомендувала, наприклад, застарілий код. Тож мені було цікаво, що не так з Башем.
токсалот

2
+1. Особливо, коли питання має bashтег поодинці, хтось коментує "Це башизм, а не портативний". Коли я відповідаю на тег C, на якому позначено тег , мені все одно, чи він портативний Javaчи ні.
ПП

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

Відповіді:


15

Як член цієї спільноти я не часто бачу, як люди нехтують башизмами за речі, націлені на баш. Якщо говорити про портативність, GNUizmi набагато гірші, ніж башизми. Поки ви використовуєте bashдля свого шебангу, ви можете очікувати, що сценарій буде виконаний за допомогою bash. Однак ви не можете гарантувати версію, якщо чітко не перевірите. Версія 4 Bash принесла деякі корисні функції, такі як асоціативні масиви, але Bash v3 все ще широко використовується в OS X і RHEL 5.

які сценарії повинні бути максимально портативними?

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

наскільки поширені системи, на яких не встановлено Bash?

FreeBSD та Solaris 10 - приклади систем, які за замовчуванням не встановлені bash. Більшість систем Linux матиме його, за винятком вбудованих систем.

якщо в системі встановлено Bash, чи буде вона також мати GNU версію пошуку та інших утиліт?

Ні, і це справжня проблема з портативністю. Якщо портативність важлива, вам слід використовувати лише функції командної оболонки, визначені стандартом POSIX. Утиліти GNU можна встановити в системах, які не є GNU, такими як FreeBSD, але вони навряд чи будуть першими в PATH, і ви не можете покластися на ті інструменти, які потрібно встановити.


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

1
Тож якщо утиліти GNU встановлені, але не спочатку в PATH, чи існує спосіб їх виклику? Інакше навіщо їх взагалі встановлювати?
токсалот

@toxalot: Бінарні файли та скрипти викликаються явно за допомогою абсолютних шляхів.
Bananguin

1
@Bananguin Отже, якщо хтось встановив утиліти Bash та GNU (але не в PATH), вони могли б використовувати сценарій, якщо вони редагують його, щоб використовувати абсолютні шляхи для findбудь-яких інших утиліт GNU, якими я користувався? Очевидно, що це не було б зручним для сценарію інсталятора. Але я думаю лише поставити щось на GitHub для інших, щоб захопити, якщо вони цього хочуть. Мені все одно, що це не портативно кожної системи. Я просто не хочу, щоб це було марним у багатьох системах.
токсалот

1
@toxalot: так, це могло б працювати. якщо ти поставиш щось подібнеFIND=/opt/gnu/dispicable/bin/find початку свого сценарію, а потім використовуєте ${FIND}замість цього findсценарію, ви даєте людям одне (!) місце для розміщення контурів встановлення та змушувати ваш сценарій використовувати правильні інструменти.
Bananguin

5

Отже, коли важливо писати портативні сценарії?

які сценарії повинні бути максимально портативними?

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

наприклад: скрипт / rmзаміна сміття


Марк Стюарт:

... для мого інструментарію з усунення несправностей я припускаю, що у мене буде лише оболонка vi та Korn. І я намагаюся використовувати команди, які працюють на більшість ароматів Unix.


3
Мені подобаються деякі гладкі "Bash-isms", але для мого інструментарію з усунення несправностей я припускаю, що у мене буде лише оболонка vi та Korn. І я намагаюся використовувати команди, які працюють на більшість ароматів Unix. Таким чином я готовий робити триаж у хворій системі, не турбуючись про те, як поводиться команда ps, чи є там Bash, Perl або PHP або де вони знаходяться.
Марк Стюарт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.