Почему я получаю разные результаты в случае sh и bash?

8

У меня есть следующий простой скрипт:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {1..99..2}
do
        echo $i
done

Вывод, если я запускаю с sh file.sh:

Bash version ...
{1..99..2}

Вывод, если я запускаю с bash file.sh:

Bash version 4.2.25(1)-release...
1
3
5
.
.
.
99

У меня есть два запроса:

  1. Если я написал строку shabang, определяющую shell, не должен ли он работать с bash, использую ли я sh file.shили bash file.sh?

  2. Я понимаю, что $BASH_VERSIONне распознается sh, но в чем проблема для цикла? Почему не печатать цифры?

rishiag
источник

Ответы:

16

shОболочка Борна старая . Его поведение определяется стандартом POSIX . Если вам нужно новое поведение, вы используете bashоболочку Bourne Again, в которую постоянно добавляются новые функции. На многих системах shэто просто bashи bashвключает режим совместимости при запуске под этим именем. В Ubuntu shэто dashоболочка Debian Almquist.

Расширение скобок - это относительно новая функция , которая также недоступна в старых версиях. Это, конечно, не должно быть sh.

Строка shebang соблюдается, только если вы вызываете скрипт как исполняемый файл:

./myscript.sh

Я могу дать сценарию любой шебанг и все равно оставить его открытым в Python, запустив:

python myscript.sh

Посмотрите эти отличные вопросы по Unix и Linux:

Мур
источник
5

СХ глупо. Он ничего не может сделать.

Он знает только самые основные команды. Больше ничего не делает.

Он не может понимать {1..99} как числовое значение. Он понимает это как строку.

SH / Dash не разработан. Предполагается, что это будет экстренная подсказка для обстоятельств DIRE (в интерактивном режиме. В противном случае это действительно хорошая вещь для сценариев).

Рекомендуется использовать Bash, поскольку он может делать все, что может SH, а также новейшие настройки и мощные функции.

В ответе на вопрос № 1 #!синтаксический анализ выполняется, только если программа вызывается напрямую. (как в, ./program.sh)

Каз Вулф
источник
6
« Предполагается, что это будет экстренное сообщение для обстоятельств DIRE » dash, которое, как вы говорите, shв Ubuntu, в основном не присутствует, «чтобы быть экстренным сообщением для обстоятельств DIRE», но вместо этого система может работать и запускаться быстро. , Таким образом, dashхорошо подходит для использования в современных ОС, но то , что он хорошо подходит для как низкопрофильной, быстрая оболочка для написания сценариев - особенно, работает система скриптов при загрузке большой, сложной, современной ОС, с минимальными затратами накладные расходы.
Элия ​​Каган
@EliahKagan Вы действительно используете SH, только если что-то ужасно неправильно.
Каз Вулф
1
Вы используете shдовольно постоянно, и особенно интенсивно, как ботинки Ubuntu. Это главным образом важно для автоматизированных сценариев, и это очень важный пример использования в Ubuntu. (Если вы должны были удалить в /bin/shсимволическую ссылку - так что, в сущности, не было бы «нет SH» - все пойдет ужасно неправильно: Ubuntu не может загрузиться в работоспособное состояние.)
Eliah Каган
@EliahKagan Когда вы в последний раз использовали SH в качестве предпочитаемого терминала? Я знаю, что вы используете его для сценария, но когда вы на самом деле используете его в интерактивном режиме?
Каз Вулф
2
Вчера, чтобы проверить, насколько портативной была команда. Но ваша точка зрения, что интерактивное использование тире является редким, является действительным. (И вообще, контекст моего интерактивного использования все еще был ориентирован на сценарии.) .... Но «использование» не означает «интерактивное использование», и что более важно, случай использования в этом вопросе не является интерактивным!
Элия ​​Каган