Чому я отримую різні результати у випадку 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. Якщо я написав рядок шабанга із зазначенням оболонки, чи не повинен він працювати з bash, використовую sh file.shчи bash file.sh?

  2. Я розумію, що $BASH_VERSIONsh не розпізнається, але в чому проблема для циклу? Чому не друкуються цифри?

Відповіді:


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

SH дурний. Він нічого не може зробити.

Знає лише найосновніші команди. Він нічого іншого не робить.

Він не може зрозуміти {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
Вчора, щоб перевірити, наскільки портативна команда. Але ваша думка, що інтерактивне використання тире є рідкісним, справедливо. (І в будь-якому разі, контекст мого інтерактивного використання все ще був орієнтований на сценарій.) .... Але "використання" не означає "інтерактивне використання", і що ще важливіше, випадок використання в цьому питанні не є інтерактивним!
Елія Каган
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.