So aktualisieren Sie bash unter Mac OS X Yosemite

25

Ich versuche nur, ein bisschen Bash-Scripting zu lernen. Meine alte Bash-Version:

Bash version 3.2.53(1)-release...

Ich habe meine Bash auf Mac OS X Yosemite mit Homebrew aktualisiert:

brew update
brew install bash

Dann habe ich in den Terminal-Eigenschaften den Standard-Shell-Pfad von /bin/bashauf geändert /usr/local/bin/bash(soweit ich weiß, installiert der Homebrew hier die aktualisierte Bash).

Dann habe ich das Ergebnis noch einmal überprüft (und es scheint, als wäre alles gut):

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

Aber als ich versuchte, ein einfaches Bash-Skript zu schreiben:

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

DAS ERGEBNIS IST:

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

ANSTATT:

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

Warum wird die Bash-Version auf die alte Version zurückgesetzt, wenn ich versuche, das Skript in derselben Shell auszuführen? Das macht mich nur verrückt! Bitte jemand erklärt mir, was mein Problem ist)))

Drew
quelle

Antworten:

17

Ihr Problem liegt in Ihrer ersten Zeile. Du hast das:

#!/bin/bash

die ausdrücklich angibt, dass das Shell-Skript mit dem alten ausgeführt werden soll /bin/bash. Was Sie wirklich wollen, ist Folgendes:

#!/usr/local/bin/bash

das neue bashaus nutzen /usr/local/bin.

BenjiWiebe
quelle
seltsame Sache, aber es hat tatsächlich nicht funktioniert. (Still gleiche Ergebnis ((Aber ich bin sicher , dass dies ein Teil eines Problems ist
Drew
Muss ich diesen Pfad woanders angeben? In irgendeiner Shell-Datei oder so?
Drew
1
Vielleicht wird die Umgebung von der aufrufenden Shell festgelegt, dh der alten Bash? Wie genau rufen Sie Ihr Skript auf, @Andrew?
Slhck
1
@ Andrew, ich vermute, dass Sie in shist /bin. brewvielleicht hat keinen Symlink machen für bashgenannt sh. Mit Ihrem $PATHSatz richtig, versuchen Sie es wie folgt beginnen: bash script.sh.
BenjiWiebe
8
Zum späteren Nachschlagen sollten Sie#!/usr/bin/env bash
pjvandehaar
15

Installiere neue Bash:

brew install bash

Machen Sie dies zur Standard-Shell:

chsh -s /usr/local/bin/bash

Legen Sie die Umgebung in einem Skript fest:

#!/usr/bin/env bash

Verwenden von envsucht nach Bash in Ihrem $PATHund verwendet das erste, auf das es stößt. Sie können sehen, welche bashdavon verwendet werden, indem Sie Folgendes eingeben which bash. Wenn es zu sehen , /bin/bashzuerst, müssen Sie Ihre setzen $PATHin ~/.bashrcund /.bash_profile.

Ben
quelle
2
Wenn bei der Verwendung "Nicht-Standard-Shell" ausgedruckt wird chsh, müssen Sie / etc / shells aktualisieren .
Scott Willeke
6

Wie pjv betonte, sollten Sie wirklich verwenden

#!/usr/bin/env bash

in Ihren Skripten überall portabel zu sein. Zum Beispiel, wenn Sie versuchen, Ihr Skript mit auszuführen

#!/usr/local/bin/bash

es wird auf den meisten Linux-Systemen fehlschlagen.

Agoston Horvath
quelle