Ausführen eines Bash-Skripts aus einer zsh-Shell

11

Ich habe Probleme beim Ausführen eines Bash-Skripts zsh. Das Skript ähnelt dem folgenden und soll unter bash ausgeführt werden:

#!/bin/bash
echo "<235234>"  | egrep -oe [0-9]+

Meine Shell ist jedoch standardmäßig aktiviert. Um zshdas obige Skript auszuführen, geben Sie /bin/bashan meiner zshEingabeaufforderung Folgendes ein und führen Sie dann aus . script.sh.

Dies führt jedoch zu einem Fehler und ich erhalte:

zsh: no matches found: [0-9]+

(Ich sollte 235234stattdessen bekommen ).

An diesem Punkt bin ich verwirrt und habe folgende Fragen:

  1. Wenn ich in bin bash, warum wird mir ein Fehler gemeldet zsh?
  2. Warum schlägt der egrepreguläre Ausdruck fehl? Der reguläre Ausdruck sieht für mich richtig aus.

Hinweis: Falls es darauf ankommt, sollte ich das Skript nicht ändern (das Skript wird von mehreren Benutzern gemeinsam genutzt und wir dürfen keine Änderungen daran vornehmen).

Vielen Dank

Amelio Vazquez-Reina
quelle

Antworten:

19

Wenn das Skript richtig mit beginnt #!/bin/bash(Sie können vorher keinen weiteren Kommentar haben), sollten Sie es einfach durch Eingabe ausführen /path/to/script.sh, ohne dies .am Anfang. Das .ist eine Erklärung enthalten, bedeutet dies „den Inhalt dieser Datei ausführen , als ob es auf der Kommandozeile hier eingegeben worden war“ (dies wird als „Sourcing“ in Unix - Shell - Jargon genannt).

Das Ausführen von Bash und das Sourcing des Skripts sollten funktionieren. Ich vermute, weil Sie Bash unter bestimmten Umständen automatisch gestartet haben, aber Sie bevorzugen zsh, haben Sie Bash so eingerichtet, dass es automatisch auf zsh umschaltet - vielleicht mit exec zshin Ihrem ~/.bashrc. Tun Sie das nicht: Stattdessen sollten Sie in der Datei, die ausgeführt wird, wenn Sie sich anmelden, auf zsh umschalten, dh ~/.profilein .bashrcRuhe lassen. Um zshin Terminals ausgeführt zu werden, legen Sie die SHELLUmgebungsvariable fest:

# in ~/.profile
export SHELL=/bin/zsh
if [ -t 1 ]; then exec $SHELL; fi

Es ist bedauerlich, dass Sie das Skript nicht ändern können, da es fehlerhaft ist. Die Klammern sollten auch in Bash angegeben werden. Wenn 3+im aktuellen Verzeichnis eine Datei aufgerufen egrepwird, sucht der Aufruf von nach einem oder mehreren Vorkommen der Ziffer 3anstelle einer Folge beliebiger Ziffern. Wenn eine Datei aufgerufen 3+und eine Datei aufgerufen wird, sucht 4+der Aufruf von nach s in der Datei . Hier kommt der Unterschied zwischen bash und zsh nur ins Spiel, wenn keine Datei mit dem angegebenen Muster übereinstimmt: bash führt den Befehl stillschweigend mit dem unsubstituierten Muster aus, während zsh (standardmäßig) einen Fehler signalisiert.egrep34+

Gilles 'SO - hör auf böse zu sein'
quelle
Danke @Guilles. Das war sehr hilfreich. Das Seltsame ist, dass ich weder exec zshauf meinem ~/.bashrcnoch auf meinem habe ~/.profile(ich habe nicht einmal ein .profilein meinem Home-Verzeichnis). Ich kann mich nicht erinnern, wie ich es geschafft habe, zshmeine Standard-Shell zu erstellen. Entschuldigen Sie auch die Verwirrung, aber die erste Zeile in meinem Skript ist der Shebang #!/bin/bash. Daher weiß ich immer noch nicht, warum das Sourcing der Datei zshnicht funktioniert (wenn Sie darüber nachdenken, lassen Sie es mich wissen). In beiden Fällen werde ich mich an den Administrator wenden, um das Skript zu aktualisieren und dem regulären Ausdruck Anführungszeichen hinzuzufügen.
Amelio Vazquez-Reina
Das Problem bei der Beschaffung in zsh ist das zweite Argument dafür egrep.
Ignacio Vazquez-Abrams