Що не оболонка?


9

Під деякими відповідями я бачу коментарі, які рекомендують уникати конкретних команд оболонок у відповідях.

Як я можу знати, які команди, оператори тощо існують у всіх оболонках? Чи є перелік стандартів?

  • man builtinsдає список команд. Це єдині команди, які я можу використовувати в скрипті портативної оболонки, який працює у всіх оболонках?
  • Чи може вбудована бути специфічною для оболонки?
  • Чи відрізняються стандарти для Linux від стандартних для Unix?
  • Що з синтаксисом? Чи можуть розділові знаки, оператори тощо відрізнятися в оболонках?

Відповіді:


12

У Greki's Wiki є публікація про адаптацію bash-скриптів для Dash, яка вказує на багато «башизмів» - додаткових функцій, які нестандартні, але є частиною bash. Уникнення цих басизмів може допомогти зробити ваш сценарій дружнішим до різних середовищ. Це особливо відповідає на деякі ваші запитання. Наприклад, так, є оператори, які відрізняються (як ==), але є стандартний набір Posix, який повинен працювати у будь-яких умовах.

Для більш ретельного читання ви можете ознайомитися зі стандартом Posix , якому повинні відповідати всі оболонки. Зокрема, том на "Shell & Utilities".

Що мені здається більш складним, ніж відмінності в оболонці - це командні відмінності. У багатьох системах Linux є GNU find, але якщо ви пишете портативний скрипт, не покладайтесь на свій власний man find, оскільки там багато систем з BSD find, який має інший набір функцій. Якщо ви пишете сценарії для зайнятої скриньки, ви виявите, що існують різні версії з абсолютно різними ncs. Це такі речі, які мене завжди отримують, коли я розгортаю сценарій в різних середовищах.

Для додаткового читання щодо хороших методів сценаріїв оболонок, також є хороший ресурс у блозі Девіда Пашлі: Написання надійних сценаріїв оболонки Баша

Крім того , переконайтеся , що ви читали Жиля відповіді і коментарі на цьому сайті. У нього є багато порад щодо забезпечення використання портативного коду.


5

Запис сценарію оболонки в певну оболонку означає встановлення цієї оболонки. Єдиний стандарт - це наявність cshта shвстановлення над усіма версіями Unix. Отже, якби ви хотіли, щоб ваш сценарій запускався на Solaris, * BSD і GNU, тоді вам доведеться записати його, скажімо, в оболонку Борна.

Однак у більшості команд Unix є різні синтаксиси під різними реалізаціями - дивіться psпід Solaris, FreeBSD та GNU - тому залежно від того, якими інструментами ви користуєтесь, ваш скрипт у будь-якому разі не може бути переносним. Там, де встановлена ​​оболонка, буде мати значення. Є чи це /bin/bash /usr/bin/bash, /usr/local/bin/bashчи де - то ще?

Я не знаю жодних стандартів, що визначають оболонку. Погляньте на rc або http://192.220.96.201/es/es-usenix-winter93.html`">е дивні нестандартні снаряди, однак, здається, вони все ще відповідають деяким загальним ідеям.


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