Jak zaktualizować bash na Mac OS X Yosemite

25

Po prostu próbuję nauczyć się trochę skryptów bash. Moja stara wersja bash:

Bash version 3.2.53(1)-release...

Zaktualizowałem moją wersję bash na Mac OS X Yosemite z Homebrew:

brew update
brew install bash

Następnie we właściwościach terminala zmieniłem standardową ścieżkę powłoki z /bin/bashna /usr/local/bin/bash(rozumiem, że tutaj homebrew instaluje zaktualizowaną wersję bash).

Następnie ponownie sprawdziłem wynik (i wydaje się, że wszystko jest w porządku):

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

Ale kiedy próbowałem napisać prosty skrypt bash:

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

WYNIK TO:

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

ZAMIAST:

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

Dlaczego wersja Bash zmienia się z powrotem na starą, kiedy próbuję wykonać skrypt w tej samej powłoce? To mnie przeraża! Proszę, wyjaśnij mi, jaki jest mój problem)))

Drew
źródło

Odpowiedzi:

17

Twój problem jest w pierwszej linii. Masz to:

#!/bin/bash

który wyraźnie stwierdza, że ​​skrypt powłoki powinien być uruchamiany ze starym /bin/bash. To, czego naprawdę chcesz, to:

#!/usr/local/bin/bash

użyć nowego bashz /usr/local/bin.

BenjiWiebe
źródło
dziwna rzecz, ale tak naprawdę nie działała. Ciągle ten sam wynik (((Jestem pewien, że jest to część problemu
Drew
Czy muszę podać tę ścieżkę gdzie indziej? W jakimś pliku powłoki czy coś?
Drew
1
Może środowisko jest ustawione przez wywołującą powłokę, tj. Starą Bash? Jak dokładnie nazywasz swój skrypt, @Andrew?
slhck
1
@Andrew, podejrzewam, że twój shjest w środku /bin. brewmoże nie utworzył dowiązania symbolicznego dla bashtzw sh. Z $PATHzestawu poprawnie, spróbuj uruchomić go w ten sposób: bash script.sh.
BenjiWiebe
8
Do wykorzystania w przyszłości prawdopodobnie powinieneś użyć#!/usr/bin/env bash
pjvandehaar,
15

Zainstaluj nowy bash:

brew install bash

Ustaw jako domyślną powłokę:

chsh -s /usr/local/bin/bash

Ustaw środowisko w skrypcie:

#!/usr/bin/env bash

Użycie envwyszuka Bash w twoim $PATHi użyje pierwszego, którego napotka. Możesz zobaczyć, z czego bashskorzysta, pisząc which bash. Jeśli to widząc /bin/bashpierwsze, trzeba będzie ustawić $PATHin ~/.bashrca /.bash_profile.

Ben
źródło
2
Jeśli podczas używania chshzostanie wydrukowana „niestandardowa powłoka” , musisz zaktualizować plik / etc / shells .
Scott Willeke,
6

Jak wskazał pjv, naprawdę powinieneś użyć

#!/usr/bin/env bash

w skryptach wszędzie, aby były przenośne. Np. Jeśli spróbujesz uruchomić skrypt

#!/usr/local/bin/bash

zawiedzie w większości systemów Linux.

Agoston Horvath
źródło