У меня есть следующий простой сценарий:
#!/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
У меня есть два запроса:
Если я записал оболочку определения строки хижины, не был должен она работать с ударом, использую ли я sh file.sh
или bash file.sh
?
Я понимаю это $BASH_VERSION
не распознан sh, но какова проблема с для цикла? Почему печать не является числами?
sh
, Оболочка Bourne, старо. Его поведение указано стандартом POSIX. Если Вы хотите новое поведение, Вы используете bash
, Граница Снова окружает, который добавил новые возможности ко всему этому время. Во многих системах, sh
справедливо bash
, и bash
включает режим эмуляции, когда выполнено под тем именем. На Ubuntu, sh
dash
, оболочка Debian Almquist.
Расширение фигурной скобки является относительно новой возможностью и не было бы доступно в более старых ударах также. Это, конечно, не должно быть в sh
.
Строку хижины только уважают при вызове сценария как исполняемого файла:
./myscript.sh
Я могу дать сценарию любую хижину и все еще иметь ее открытый в Python путем выполнения:
python myscript.sh
Посмотрите эти превосходные вопросы на Unix & Linux:
SH глуп. Это ничего не может сделать.
Это только знает самые основные команды. Это не делает ничего больше.
Это не может понять {1.. 99} как числовое значение. Это понимает его как строку.
SH/Dash не разрабатывается. Это предназначено, чтобы быть чрезвычайной подсказкой для СТРАШНЫХ обстоятельств (в интерактивном режиме. Иначе это - действительно хорошая вещь для сценариев.).
Bash рекомендуется, поскольку он может сделать все, что SH может, а также новейшее в функциях пользовательской настройки и мощных функциях.
В ответе на № 1, эти #!
только анализируется, если программу называют непосредственно. (как в, ./program.sh
)