Warum funktionieren Bash-Skripts nicht gut, wenn die Standard-Shell nicht bash-kompatibel ist?

3257
endolith

Meine Standardshell ist Fisch, weil es viel schöner ist. Wenn ich jedoch Skripts ausführe, erhalte ich häufig Fehler, die anscheinend auf das Bash-Skript zurückzuführen sind, das von fish verarbeitet wird. Ich denke, das liegt daran, dass der Skript-Autor davon ausgegangen ist, dass die Standard-Shell bash ist, aber ich verstehe den Mechanismus nicht.

Zum Beispiel beginnt das CrashPlan-Skript install.sh mit einem bash shebang:

~/CrashPlan-install> head install.sh #!/bin/bash  ############################################################# # Linux Client Installer Script ############################################################# 

Wenn ich also laufe ./install.sh, sollte es von Bash verarbeitet werden, oder? Die Standard-Terminal-Shell sollte irrelevant sein. Wenn meine Standard-Shell jedoch "fish" ist, führt die Ausführung von Skripts wie folgt aus, dass Fische Fehler zurückgeben, als würde das Skript verarbeitet:

fish: Expected a command name, got token of type “Run job in background”. Did you mean “COMMAND; and COMMAND”? See the help section for the “and” builtin command by typing “help and”. Standard input: sed -imod "s|Exec=.*|Exec=/usr/local/crashplan/bin/CrashPlanDesktop|"  /home/username/Desktop/CrashPlan.desktop && rm -rf /home/username/Desktop/CrashPlan.desktopmod  

Liegt dies an einer falschen Konfiguration meines Computers oder daran, dass das Skript nicht portierbar geschrieben ist?

4

1 Antwort auf die Frage

5
Dennis

So when I run ./install.sh it should be processed by bash, right?

Indeed. That's exactly what the shebang is for.

Troubleshooting

  • Save the following as test.sh and try to run it from fish.

    #!/bin/bash true && true 

    It works on my computer, and it should on yours.

  • Check if the first line of install.sh contains only the characters #!/bin/bash.

    Invisible characters (such as a CR linebreak) could confuse fish.

  • Run

    /bin/bash --version 

    to check that bash is actually bash and hasn't been accidentially replaced/modified over time.

install.sh

$SRC_USER is just a synonym the script creates for $SUDO_USER.

As a result, when the script is run with root privileges, the command

su $ -c "sed -imod \"s|Exec=.*|Exec=$|\" $ && rm -rf $mod" 

automatically uses the sudo user's default shell, which is fish.

To override this default, add the instruction -s /bin/bash to the su command.

`. / test.sh` läuft einwandfrei, erzeugt keine Fehler und ein Hex-Dump von test.sh und install.sh ist für die ersten 13 Bytes identisch. Und ja, es ist `GNU bash, Version 4.2.24 (1) -release`. Etwas mit dem `Exec = '- Teil des install.sh-Skripts zu tun? endolith vor 11 Jahren 0
Vielleicht, aber es ist schwer aus dem Kontext zu sagen. Könnten Sie `install.sh` hier posten oder, falls es zu lang ist, auf Pastebin? Dennis vor 11 Jahren 0
http://pastebin.com/xAZM1BgF Oh nein, jetzt sehe ich, dass "Exec" Teil einer `.desktop'-Datei ist, die das Skript erstellt, nicht Teil des Skripts selbst. endolith vor 11 Jahren 0
Ich verstehe es ehrlich gesagt nicht: Fische können mit den if-Befehlen nicht umgehen, warum also warten, bis die Sed-Linie erstickt? Was passiert, wenn Sie `bash install.sh` ausführen? Dennis vor 11 Jahren 0
Dasselbe passierte mit `sudo install.sh` oder` bash install.sh`. Etwas mit `su $ ` zu tun? Die Standard-Shell von root ist bash. endolith vor 11 Jahren 0
Ich glaube du hast es verstanden. `su` führt den Befehl unter Verwendung der` SRC_USER`-Shell aus, die, wenn ich es richtig verstanden habe, nicht 'root' ist. Versuchen Sie, "su" durch "su -s / bin / bash" zu ersetzen. Dennis vor 11 Jahren 0
Ja, ich denke es ist der `su` Befehl. Ich habe einen Benutzer "fishy" mit Fisch als Standardshell erstellt. Von bash führt `su fishy" true && true "` zu einem Fehler. `su fishy -s / bin / bash -c" true && true "` funktioniert einwandfrei. Dennis vor 11 Jahren 2
super, das scheint es zu beheben. Können Sie das in Ihre Antwort aufnehmen, bevor ich es akzeptiere? endolith vor 11 Jahren 0
Schön, dass es so ist. Ich habe meine Antwort aktualisiert. Dennis vor 11 Jahren 0