Что не является специфичным для оболочки?


9

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

Как узнать, какие команды, операторы и т. Д. Существуют во всех оболочках? Есть ли список стандартов?

  • man builtinsдает список команд. Это единственные команды, которые я могу использовать в переносимом сценарии оболочки, который работает во всех оболочках?
  • Может ли встроенная оболочка быть специфичной для оболочки?
  • Отличаются ли стандарты для Linux от других Unixes?
  • Как насчет синтаксиса? Могут ли знаки препинания, операторы и т. Д. Быть разными в некоторых оболочках?

Ответы:


12

В Wiki Грега есть пост по адаптации bash-скриптов для Dash , в котором упоминается множество «bashisms» - дополнительных функций, которые не являются стандартными, но являются частью bash. Предотвращение этих ошибок может помочь сделать ваш сценарий более дружественным к различным средам. Это особенно отвечает на некоторые ваши вопросы. Например, да, есть операторы, которые отличаются (например ==), но есть стандартный набор Posix, который должен работать во всех средах.

Для более подробного ознакомления вы можете ознакомиться со стандартом Posix , которому должны соответствовать все оболочки. В частности, том о «Shell & Utilities».

Что мне кажется более сложным, чем различия оболочек, так это различия команд. Многие системы Linux имеют GNU find, но если вы пишете переносимый скрипт, не полагайтесь на свой собственный man find, потому что существует множество систем с BSD find, у которых есть другой набор функций. Если вы пишете сценарии для busybox, вы обнаружите, что есть разные версии с совершенно разными ncs. Это те вещи, которые меня всегда привлекают, когда я развертываю скрипт в разных средах.

Для дополнительного чтения о хороших методах написания сценариев в оболочке, есть также хороший ресурс в блоге Дэвида Пашли: Написание надежных сценариев Bash Shell

Также обязательно прочитайте ответы и комментарии Жиля на этом сайте. У него много советов о том, чтобы убедиться, что вы используете переносимый код.


5

Написание сценария оболочки в определенной оболочке означает, что эта оболочка установлена. Единственный стандарт - иметь cshи shустанавливать поверх всех вариантов Unix. Итак, если вы хотите, чтобы ваш скрипт работал на Solaris, * BSD и GNU, то вам нужно было бы написать его, скажем, в оболочке Bourne.

Однако большинство команд Unix имеют разные синтаксисы в разных реализациях - посмотрите на psSolaris, FreeBSD и GNU - поэтому в зависимости от того, какие инструменты вы используете, ваш сценарий может быть не переносимым в любом случае. Место установки оболочки также будет иметь значение. Является ли это /bin/bash /usr/bin/bash, /usr/local/bin/bashили где - то еще?

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


7
POSIX определяет ш.
Random832
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.