Ich installiere ein riesiges Programm, dessen Ressourcen als rpm
Datei vorliegen. Es klebte an der Linie von
#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]
Anscheinend sh
funktioniert bash
Red Hat Linux mit dieser Syntax, aber es gibt den Fehler unexpected operator
in Ubuntu.
Ich kann das Skript nicht in ändern, bash
da das Skript aus dem rpm
Paket stammt. Ich kann das rpm
Paket extrahieren und neu packen , aber möglicherweise gibt es viele solcher Skripte.
Gibt es eine Möglichkeit, die Shell-Standardeinstellung so zu ändern, dass sie #!/bin/sh
als bash
oder als alles andere behandelt wird, was mit dem [
Operator umgehen kann ?
==
, ist das , was sein sollte=
. Das und die Variablenerweiterungen sollten in doppelte Anführungszeichen gesetzt werden.[
ist kein Operator, sondern ein eingebauter Befehl, der aufgerufen wirdtest
. Der unerwartete Operator ist==
und sollte durch ersetzt werden,=
da er nicht POSIX-kompatibel ist.$SCITEGICPERLHOME
dass zitiert werden sollte.#!/bin/sh
, sollten sie sicherstellen, dass sie nur POSIX-Shell-Funktionen verwenden, keinebash
Erweiterungen. Dieser Programmierer ist sehr schlampig. Er sollte entweder seinen Code reparieren oder verwenden#!/bin/bash
.Antworten:
Es gibt mehrere Programme, die die Sprache von implementieren
/bin/sh
. Auf Ubuntu/bin/sh
ist dash, das so konzipiert ist, dass es schnell ist, wenig Speicher benötigt und nicht viel mehr als das Minimum unterstützt, das von erwartet wird/bin/sh
. Auf RHEL/bin/sh
ist bash langsamer und benötigt mehr Speicher, hat aber mehr Funktionen. Eine dieser Funktionen ist der==
Operator für die[
bedingte Syntax. Dash unterstützt[
, was eine grundlegende sh-Funktion ist, aber keinen==
Operator hat, der eine bash- (und ksh- und zsh-) Erweiterung ist.Sie können Ihr System auf bash umstellen. Unter Ubuntu gibt
/bin/sh
es eine symbolische Verknüpfung zudash
. Sie könnenbash
stattdessen einen symbolischen Link zu erstellen. Aktuelle Versionen von Debian und Ubuntu (und Derivaten) machen dies zu einer Installationsoption von Dash. Führen Sie zum Ändern den Befehl ausund antworten Sie mit "Ja", um den Gedankenstrich beizubehalten,
/bin/sh
oder mit "Nein", um zur Bash zu wechseln.Sie können Bash als behalten
/bin/sh
, aber es wird Ihr System ein bisschen langsamer machen. Es ist sogar vorstellbar, dass einige Systemskripte nicht mit bash kompatibel sind, obwohl dies unwahrscheinlich ist, da bash meistens eine Übermenge von Gedankenstrichen ist.Für Distributionen, die keine Schnittstelle zur Auswahl zwischen Implementierungen von haben
/bin/sh
, lesen Sie hier, wie Sie zu bash wechseln.Lassen Sie ein Terminal geöffnet und prüfen Sie, ob Sie danach noch einige
sh
Skripte ausführen können . Wenn Sie diesen Befehl durcheinander bringen, wird Ihr System unbrauchbar. (Übrigens, der Grund, warum ich die oben genannten Mehrfachbefehle anstelle der unkomplizierten Befehle verwendet habesudo ln -sf bash /bin/sh
,ln -sf
ist nicht atomar. In dem zugegebenermaßen unwahrscheinlichen Fall, dass Ihr Computer während dieses Vorgangs abstürzt, müssen Sie von einem Notfallmedium booten, um ihn wiederherzustellen. Ist dagegenmv
atomar.)So stellen Sie den Bindestrich wieder her als
/bin/sh
:Beachten Sie, dass das
/bin/bash
Umschalten auf dash zu einem Fehlschlagen von Skripten führen kann , wenn sh in Ihrer Distribution standardmäßig aktiviert ist, da bash viel mehr Funktionen als dash enthält. Bash-Skripte sollten mit beginnen#!/bin/bash
, und Skripte, die mit beginnen,#!/bin/sh
sollten keine bash-spezifischen Funktionen verwenden, aber Distributionen, die mit bash ausgeliefert werden, verwenden/bin/sh
möglicherweise bash-spezifische Funktionen in#!/bin/sh
Skripten, die für diese Distribution spezifisch sind (es ist in Ordnung, solange keine Benutzererwartungen bestehen) kann zu dash as wechseln/bin/sh
und es gibt keine Erwartung, dass diese Skripte auf einer anderen Distribution funktionieren).quelle
/bin/sh
ist es ein Fehler im System (das Paket mit dem Skript) oder im Bash-sh
Modus , wenn ein Skript fehlschlägt, wenn es Bash ist . Wie Stephen sagt, erlaubt das System explizit das Zurücksetzen/bin/sh
auf Bash überdpkg-reconfigure
. Diesbezüglich wird es auch/bin/sh
Bash ist, ist es ein Fehler. Es treten jedoch Fehler auf. Ich empfehle, die Standardeinstellung beizubehalten, wenn Sie nicht in der Lage und bereit sind, solche Fehler zu diagnostizieren, da andere Personen sie für Sie getestet haben. Ich habe dash verwendet, wie/bin/sh
zuvor, als es offiziell von Debian unterstützt wurde, aber dies war ein Risiko, das ich eingegangen bin, da ich wusste, dass ich in der Lage sein würde, mit dem Problem umzugehen, wenn etwas passiert.debconf
der nächstendash
Aktualisierung gespeichert wird. Zugegebenermaßen kommt dies bei Systemen, auf denen Debian stable ausgeführt wird, nicht oft (wenn überhaupt, in einer bestimmten Version) vor.Um
sh
zubash
(anstelledash
der Standardeinstellung) zu wechseln , konfigurieren Siedash
es neu (ja, es ist etwas kontraintuitiv):Hier werden Sie gefragt, ob Sie
dash
die Standard-System-Shell sein möchten . Antworten Sie mit "Nein" ( Tabdann Enter) undbash
werden stattdessen zur Standardeinstellung ( dh/bin/sh
zeigen auf/bin/bash
).quelle