Вы должны только когда-либо использовать #! /bin/sh
.
Вы никогда не должны использовать расширения bash (или zsh, или fish, или ...) в сценарии оболочки.
Вы должны когда-либо писать сценарии оболочки, которые работают с любой реализацией языка оболочки (включая все «служебные» программы, которые идут вместе с самой оболочкой). В эти дни вы, вероятно, можете считать POSIX.1-2001 ( не -2008) авторитетным для того, на что способны оболочка и утилиты, но помните, что однажды вас могут попросить перенести ваш скрипт в унаследованную систему (например, Solaris). или AIX), чьи оболочки и утилиты были заморожены около 1992 года.
Что, серьезно ?!
Да серьезно.
Вот в чем дело: Shell - ужасный язык программирования. Единственное, что у него есть /bin/sh
- это единственный интерпретатор сценариев, который гарантированно будет в каждой установке Unix.
Вот еще одна вещь: некоторая итерация основного интерпретатора Perl 5 ( /usr/bin/perl
) с большей вероятностью будет доступна в случайно выбранной установке Unix, чем (/(usr|opt)(/(local|sfw|pkg)?)?/bin/bash
есть. Другие хорошие языки сценариев (Python, Ruby, node.js и т. Д. - я даже включу PHP и Tcl в эту категорию при сравнении с оболочкой) также примерно так же доступны, как bash и другие расширенные оболочки.
Поэтому, если у вас есть возможность написания bash-скрипта, у вас есть возможность использовать не просто ужасный язык программирования.
Теперь, простые сценарии оболочки, такие, которые запускают несколько программ последовательно из задания cron или чего-то еще, нет ничего плохого в том, чтобы оставить их как сценарии оболочки. Но простые сценарии оболочки не нуждаются в массивах, функциях или [[
даже. И вы должны писать сложные сценарии оболочки только тогда, когда у вас нет другого выбора. Например, сценарии Autoconf по-прежнему являются сценариями оболочки. Но эти сценарии должны выполняться при каждом воплощении, /bin/sh
которое имеет отношение к настраиваемой программе. и это означает, что они не могут использовать какие-либо расширения. Возможно, вам не нужно заботиться о старых проприетарных Unix-файлах в наши дни, но вам, вероятно, следует заботиться о текущих BSD с открытым исходным кодом, некоторые из которых не устанавливаютсяbash
по умолчанию, и встроенные среды, которые дают вам только минимальную оболочку и busybox
.
В заключение, в тот момент, когда вы обнаруживаете, что вам нужна функция, недоступная в переносимом языке оболочки, это признак того, что сценарий стал слишком сложным, чтобы оставаться сценарием оболочки. Перепишите его на лучшем языке.
bash
функции и синтаксис, а неsh
функции и синтаксис.