Большая часть кода, который я пишу, написана на PHP. Я недавно начал изучать сценарии оболочки. Большинство ресурсов и учебных пособий, с которыми я сталкивался, относятся к Bash. Некоторые предупреждают о bashisms, а некоторые нет. Я много читал здесь и переполнение стека.
Всякий раз, когда в ответе используются ошибки , кто-то неизбежно комментирует:
Вы не должны использовать <вставьте здесь bashism>. Это не портативный.
Это происходит даже тогда, когда вопрос был помечен bash. Для меня это все равно, что сказать программисту PHP, что они не должны использовать код, новый в PHP 5, потому что его нельзя использовать с PHP 4. Или сказать кому-то, что они не должны писать что-то для Mac, потому что его нельзя использовать на винде.
Когда я пишу в PHP, я выбираю минимальное требование , и я пишу вперед -совместимый код. Я не беспокоюсь о том, чтобы сделать его обратно- совместимым.
Если я использую #!/bin/bash
в качестве шебанга, почему я не должен использовать bashisms? Я начинаю , чтобы получить впечатление , что некоторые люди просто любят Баш bashisms (каламбур) только ради этого.
Люди часто используют bash
и shell
взаимозаменяемо - вероятно, из-за того, что bash является оболочкой по умолчанию во многих системах. Таким образом, я могу понять добавление комментария, предупреждающего, что код использует bashisms, но я не понимаю, что их использование неправильно .
Очевидно, что если я пишу сценарий исключительно для личного использования, я могу написать его на любом языке, который захочу. Но я хотел бы думать, что часть написанного мной кода может быть полезна для других.
Я пытался найти ответ на свой вопрос перед публикацией. Я нашел много информации о том, как проверить переносимость, но не смог найти ничего, когда это важно сделать.
Итак, когда важно писать переносимые сценарии?
Например,
- какие типы сценариев должны быть максимально переносимыми?
- Насколько распространены системы, в которых не установлен Bash?
- если в системе установлен Bash, будет ли у него также версия GNU find и другие утилиты?
источник
bash
только один тег, кто-то комментирует: «Это башизм, а не переносимость». Когда я отвечаю на вопрос, помеченный тегамиC
, мне все равно, переносим онJava
или нет.bash
особая функция, а не переносимая, точно так же, как я бы отметил, что для какой-либо утилиты используется расширение, специфичное для GNU (даже если вопрос был помечен как Linux). Я никогда не видел, чтобы кто-нибудь говорил: «Это башизм, и вы никогда не должны его использовать».Ответы:
Как член этого сообщества, я не часто вижу людей, игнорирующих bashisms для вещей, которые нацелены на bash. Говоря о переносимости, GNUisms гораздо хуже, чем bashisms. Пока вы используете
bash
для своего шебанга, вы можете ожидать, что скрипт будет выполнен с использованиемbash
. Тем не менее, вы не можете гарантировать версию, если вы не проверите явно. Bash версии 4 принес некоторые полезные функции, такие как ассоциативные массивы, но Bash v3 все еще широко используется в OS X и RHEL 5.Это больше о ваших потребностях и о том, что вы решите поддержать как разработчик. Если вы пишете скрипт установки для приложения, которое поддерживает все типы * NIX, переносимость будет очень важна.
FreeBSD и Solaris 10 являются примерами систем, которые не поставляются с установленной по умолчанию bash. Большинство систем Linux будет иметь его, за исключением встроенных систем.
Нет, и это реальная проблема с мобильностью. Если важна переносимость, вы должны использовать только те команды оболочки, которые определены стандартом POSIX. Утилиты GNU могут быть установлены в не-GNU системах, таких как FreeBSD, но они вряд ли будут первыми в PATH, и вы не можете полагаться на эти инструменты, которые будут установлены.
источник
find
любых других утилит, специфичных для GNU, которые я использовал? Очевидно, что это не будет удобно для сценария установщика. Но я думаю просто поместить что-то на GitHub, чтобы другие могли его захватить, если они того пожелают. Мне все равно, что он не переносим для каждой системы. Я просто не хочу, чтобы это было бесполезно во многих системах.FIND=/opt/gnu/dispicable/bin/find
в начале вашего сценария, а затем используете${FIND}
вместо этогоfind
в своем сценарии, вы даете людям одно (!) место, чтобы указать их пути установки и заставить ваш сценарий использовать правильные инструменты.Когда вы используете их для своей рабочей среды и работаете (или могли бы работать в будущем) на разных машинах - И вам не нужно переписывать свои инструменты перед тем, как приступить к работе.
например: мусорный скрипт /
rm
заменаМарк Стюарт:
... для моего инструментария по устранению неполадок я предполагаю, что у меня будут только оболочки vi и Korn. И я пытаюсь использовать команды, которые работают на большинстве разновидностей Unix.
источник