25

Просто пытаюсь немного изучить скрипты bash. Моя старая версия Bash:

Bash version 3.2.53(1)-release...

Я обновил мой bash на Mac OS X Yosemite с помощью homebrew:

brew update
brew install bash

Затем в свойствах терминала я изменил стандартный путь оболочки с /bin/bash на /usr/local/bin/bash (насколько я понимаю, именно здесь homebrew устанавливает обновленный bash).

Затем я проверил результат еще раз (и кажется, что все хорошо):

$ echo $BASH_VERSION
Bash version 4.0.33(0)-release...

Но когда я пытался написать простой скрипт bash:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {0..10..2}
  do
     echo "Welcome $i times"
 done

РЕЗУЛЬТАТ ЭТО:

Bash version 3.2.53(1)-release...
Welcome {0..10..2} times

ВМЕСТО:

Bash version 4.0.33(0)-release...
Welcome 0 times
Welcome 2 times
Welcome 4 times
Welcome 6 times
Welcome 8 times
Welcome 10 times

Почему версия Bash меняется обратно на старую, когда я пытаюсь выполнить скрипт в той же оболочке ??? Это просто бесит меня! Пожалуйста, кто-нибудь объясните мне, в чем моя проблема)))

3 ответа3

17

Ваша проблема в вашей первой строке. У вас есть это:

#!/bin/bash

который явно указывает, что скрипт оболочки должен запускаться со старым /bin/bash . То, что вы действительно хотите, это:

#!/usr/local/bin/bash

использовать новый bash из /usr/local/bin .

13

Установите новый bash:

brew install bash

Сделайте это оболочкой по умолчанию:

chsh -s /usr/local/bin/bash

Установите среду в скрипте:

#!/usr/bin/env bash

Использование env будет искать Bash в вашем $PATH и использовать первое, с которым он столкнется. Вы можете увидеть, какой bash он будет использовать, набрав, which bash . Если он сначала видит /bin/bash , вам нужно установить $PATH в ~/.bashrc и /.bash_profile .

5

Как указал pjv, вы действительно должны использовать

#!/usr/bin/env bash

в ваших сценариях везде быть переносимым. Например, если вы попытаетесь запустить свой скрипт с

#!/usr/local/bin/bash

это не удастся на большинстве систем Linux.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .