Я знаю, что могу использовать любой из сценариев в качестве первой строки для вызова желаемой оболочки.
Было #!/bin/sh
бы рекомендовано, если совместимость со всеми системами Unix является абсолютным требованием?
В моем случае единственные операционные системы, о которых я забочусь, это Ubuntu (Debian) и OSX. Учитывая это, могу ли я использовать #!/bin/bash
и быть уверенным, что он будет работать на обеих системах?
Не облегчит ли это также использование сценариев с более современным и понятным синтаксисом для команд? Использование #!/bin/sh
также связано с использованием POSIX?
/bin
и/usr/bin
. В результате, в#!/usr/bin/env <shname>
наши дни , вероятно, лучше использовать для мобильности.Ответы:
Для начала, если вы можете сделать предположение, что Bash предустановлен (что, насколько мне известно, имеет место во всех перечисленных вами системах), используйте следующий hashbang для совместимости:
это вызывает все, что
bash
происходит, независимо от того, находится он в/bin
или/usr/local/bin
.Хотя на большинстве систем в широком диапазоне (включая AIX, Solaris, несколько разновидностей BSD)
bash
,env
оказывались в разных местах, всегда оказывались/usr/bin/env
. Уловка, однако, не моя, но от автора Поваренной книги Bash.В любом случае, да, Bash позволит вам использовать некоторые «современные» функции, которые сделают вашу жизнь проще.
Например двойные скобки:
в то время как в традиционных диалектах оболочки вам придется прибегнуть к:
но лучшее в двойных скобках то, что они позволяют регулярные выражения для сопоставления. Bash Hackers Wiki даст вам много трюков в этом направлении.
Вы также можете использовать довольно удобные выражения, такие как
$((2**10))
или другие арифметические выражения, встроенные в$((expression))
синтаксис.Использование backticks для подоболочек хорошо, хотя и немного устарело. Но вложенные возможности
$(command ...)
вызовов гораздо удобнее, так как вам не придется избегать многих вещей на разных уровнях подоболочек.Это всего лишь несколько вещей, которые Bash дает вам по сравнению с традиционным
sh
синтаксисом POSIX .Но если вы хотите больше возможностей для оболочки (не только в сценариях), также посмотрите
zsh
.источник
sh
для таких задач.sh
связанных сbash
, уязвимость не будет устранена с помощьюsh
.В Debian и Ubuntu
/bin/sh
естьdash
оболочка, совместимая с POSIX. Если вы укажете#!/bin/sh
, вы должны ограничить себя инструкциями POSIX в вашем скрипте. (Преимущество в том, что онdash
запускается быстрееbash
, поэтому ваш скрипт может выполнить свою работу за меньшее время.)Во многих (большинстве?) Других системах Linux,
/bin/sh
именноbash
поэтому многие сценарии пишутся в#!/bin/sh
виде строки shebang, даже если они используютbash
расширения.Если вы хотите использовать
bash
расширения, самый безопасный подход во всех системах - указать#!/bin/bash
; таким образом, вы явно указываете свою зависимость отbash
. Вы должны сделать это в Debian и Ubuntu. В качестве дополнительного бонуса, при запуске/bin/sh
bash
деактивирует некоторые расширения (подробнее см. Описание режимаbash
POSIX ); так что уточнение#!/bin/bash
необходимо, чтобы получить полную выгодуbash
.На OS X
/bin/bash
тоже/bin/sh
есть и естьbash
. Указание#!/bin/bash
будет работать там хорошо.источник
Да, и OSX и Linux придут с
/bin/bash
. Вы должны быть в полной безопасности. Однако это не POSIX. Оболочка POSIX используется в/bin/sh
большинстве (всех?) Систем, и это наиболее переносимый подход и единственный способ быть совместимым с POSIX.Обратите внимание, что в то время как во многих системах он
/bin/sh
указывает наbash
, в других он может указывать на разные оболочки. Это символическая ссылкаdash
на Debian и Ubuntu, например. Кроме того, даже если/bin/sh
ссылка является ссылкойbash
, поведение оболочки изменяется, когда она вызывается какsh
(изman bash
, выделено мной):источник
Если совместимость со «всеми системами Unix» является абсолютным требованием, а если нет, то почему вы пишете сценарий оболочки? - тогда, да, вы должны использовать
#! /bin/sh
, потому что Bash не гарантированно будет установлен где-либо , не говоря уже о/bin
.Это на самом деле намного, намного хуже, чем это. Если вам нужна совместимость со всеми системами Unix, это включает в себя такие вещи, как Solaris и AIX, которые заморозили их оболочки примерно в 1995 году. Это означает, что вы должны использовать такие вещи, как старомодный
sort +N
синтаксис - что более новые системы упали! И это также означает, что нет функций оболочки, нет массивов, нет[[ ... ]]
, нет${foo#glob}
, нет$(( ... ))
для арифметики, возможно, нет$( ... )
подстановки команд в стиле, маленькие и недокументированные верхние пределы того, как большой ввод может быть получен, ...Вы, вероятно, можете избежать неприятностей с такой большой совместимостью, но если это вообще проблема, я настоятельно рекомендую вам рассмотреть язык, который менее ужасен, чем shell. Базовый интерпретатор Perl более доступен, чем Bash.
источник