Все варианты языка оболочки Bourne объективно ужасны по сравнению с современными языками сценариев, такими как Perl, Python, Ruby, node.js и даже (возможно) Tcl. Если вам нужно сделать что-то даже немного сложное, в конечном итоге вы будете счастливее, если вместо одного из сценариев оболочки вы воспользуетесь одним из вышеперечисленных.
Единственное преимущество, которое язык оболочки по-прежнему имеет по сравнению с этими новыми языками, заключается в том, что что- то, вызывающее себя /bin/sh
, гарантированно существует во всем, что подразумевает Unix. Однако это что-то может даже не соответствовать POSIX; многие из устаревших проприетарных Unix-систем заморозили язык, реализованный с /bin/sh
помощью утилит в PATH по умолчанию, до изменений, требуемых Unix95 (да, Unix95, двадцать лет назад и считая). Там может быть набор Unix95 или даже POSIX.1-2001, если вам повезет, инструменты в каталоге не по умолчанию PATH (например /usr/xpg4/bin
), но они не гарантированно существуют.
Однако основы Perl более вероятно присутствуют в произвольно выбранной установке Unix, чем Bash. (Под «Основы Perl» Я имею в виду , /usr/bin/perl
существует и некоторые , возможно , довольно старая, версия Perl 5, и если вам повезет , множество модулей , которые поставляются с этой версией интерпретатора, также доступны.)
Следовательно:
Если вы пишете что-то, что должно работать везде , где подразумевается Unix (например, скрипт «configure»), вам нужно использовать его #! /bin/sh
, и вам вообще не нужно использовать никаких расширений. В настоящее время я написал бы POSIX.1-2001-совместимую оболочку в этих обстоятельствах, но я был бы готов к исправлению POSIXisms, если бы кто-то попросил поддержки для ржавого железа.
Но если вы не пишете что-то, что должно работать везде, то в тот момент, когда у вас возникает соблазн использовать какой-либо Bashism, вам следует остановиться и переписать все это на лучшем языке сценариев. Ваше будущее я будет вам благодарен.
(Поэтому , когда не ассигновать использовать расширение Bash Для первого порядка: никогда Для второго порядка: только для расширения интерактивной среды Bash - например , для обеспечения смарта табуляции завершения и орнаментальные подсказок?.) .
#!/bin/sh
и не используйте ничего, кроме того, что было в оригинальной оболочке.