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

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

#!/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. Если я записал оболочку определения строки хижины, не был должен она работать с ударом, использую ли я sh file.sh или bash file.sh?

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

8
задан 30 August 2014 в 10:40

2 ответа

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

Расширение фигурной скобки является относительно новой возможностью и не было бы доступно в более старых ударах также. Это, конечно, не должно быть в sh.

Строку хижины только уважают при вызове сценария как исполняемого файла:

./myscript.sh

Я могу дать сценарию любую хижину и все еще иметь ее открытый в Python путем выполнения:

python myscript.sh

Посмотрите эти превосходные вопросы на Unix & Linux:

17
ответ дан 16 November 2019 в 16:44

SH глуп. Это ничего не может сделать.

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

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

SH/Dash не разрабатывается. Это предназначено, чтобы быть чрезвычайной подсказкой для СТРАШНЫХ обстоятельств (в интерактивном режиме. Иначе это - действительно хорошая вещь для сценариев.).

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

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

5
ответ дан 16 November 2019 в 16:44

Другие вопросы по тегам:

Похожие вопросы: