Как обновить bash на Mac OS X Yosemite

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

Нарисовался
источник

Ответы:

17

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

#!/bin/bash

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

#!/usr/local/bin/bash

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

BenjiWiebe
источник
странная вещь, но на самом деле это не сработало. Все тот же результат (((Но я уверен, что это является частью проблемы
Дрю
Нужно ли указывать этот путь где-то еще? В каком-то файле оболочки или что-то?
Дрю
1
Может быть, среда задается вызывающей оболочкой, т.е. старым Bash? Как именно ты называешь свой сценарий, @Andrew?
Slhck
1
@ Андрей, я подозреваю, что ты shздесь /bin. brewможет быть , не сделать символическую ссылку для bashназывается sh. С вашим $PATHнабором правильно, попробуйте запустить его так: bash script.sh.
BenjiWiebe
8
Для дальнейшего использования, вероятно, вы должны использовать#!/usr/bin/env bash
pjvandehaar
15

Установите новый 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.

Бен
источник
2
Если вы видите, что «нестандартная оболочка» распечатывается при использовании chsh, вам нужно будет обновить / etc / shells .
Скотт Виллек
6

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

#!/usr/bin/env bash

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

#!/usr/local/bin/bash

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

Агостон Хорват
источник