Wikipedia sagt, dass die dashAusführung schneller als bash. Meine Frage ist, wenn ich gesetzt /bin/shzu dashwerden alle Skripte , die Verwendung /bin/shin ihrer shebang Linie , die bestimmt war bashArbeit unter dash?
Wenn sie nicht funktionieren, sollten Sie den Autor anschreien und ihm sagen, dass das #! Zeile sollte sein #!/bin/bashund dass seine Skripte nicht Posix-konform sind und daher angegeben werden müssen, um mit dem richtigen Interpreter ausgeführt zu werden
Xenoterracide
Antworten:
12
Nein, nicht alle für Bash bestimmten Skripte funktionieren mit Bindestrich. Eine Reihe von 'Bashism' funktioniert nicht im Bindestrich, wie z. B. der C-Stil für Schleifen und die Doppelklammer-Vergleichsoperatoren. Wenn Sie über eine Reihe von Bash-Skripten verfügen, die Sie für Dash verwenden möchten, können Sie Checkbashisms verwenden . Dieses Tool überprüft Ihr Skript auf Nur-Bash-Funktionen, die im Bindestrich wahrscheinlich nicht funktionieren.
Aber Skripte mit / bin / sh im Shebang sind nicht für Bash gedacht, oder?
2
@hop: Sie sind möglicherweise nicht für Bash gedacht, können aber dennoch nur für Bash getestet werden.
Maciej Piechotka
2
@MaciejPiechotka Jedes Skript , das eine shebang Linie verwendet , #!/bin/shaber nicht funktioniert in /bin/sh( zum Beispiel , weil es wurde geschrieben und läuft nur in bash) sollte in Betracht gezogen wird gebrochen . Der einfachste Weg, solche Skripte zu reparieren, besteht darin, den Shebang durch #!/bin/bash(oder #!/usr/bin/env bash) zu ersetzen .
jw013
1
@ MaciejPiechotka Du vermisst meinen Standpunkt. Ich habe nicht vorgeschlagen, dass jeder jetzt alle Fehler in Skripten auf seinem System beheben sollte. Niemand hat Zeit dafür und wenn sie bereits arbeiten, gibt es viel dringendere Dinge zu tun. Ich möchte nur auf die unbestreitbare Tatsache hinweisen , dass Sie ein Skript, das nur von bashFunktionen abhängt , als solches und nicht als deklarieren sollten sh. Andernfalls funktioniert es einfach nicht auf einem System, mit dem keine shVerbindung besteht bash. Das Praktische ist, Ihre Skripte richtig zu schreiben und zu zeigen, damit sie tatsächlich funktionieren .
jw013
-1
Nicht einmal sh-Skripte sind mit dash kompatibel. Pkgsrcs Bootstrap, zum Beispiel.
Interessant. Ich hatte den Eindruck, dass aktuelle Versionen von Dash POSIX-kompatibel sind. Eine schnelle Überprüfung mit dash -nhat beim Ausführen von Bootstrap keine Fehler ergeben, aber das ist der naivste Test.
Steven D
@Steven IIRC gibt es eine Variable, dashdie nicht unterstützt wird. Möglicherweise mehr Dinge, aber die Liste ist sehr klein.
Xenoterracide
dash ist eine Portierung von NetBSDs sh für Debian, daher ist es unwahrscheinlich, dass es für etwas nicht funktioniert, das für die Verwendung mit NetBSDs sh entwickelt wurde. Ironischerweise ist dieses Skript nicht POSIX-konform, aber Debian-konform, da es verwendetlocal
#!/bin/bash
und dass seine Skripte nicht Posix-konform sind und daher angegeben werden müssen, um mit dem richtigen Interpreter ausgeführt zu werdenAntworten:
Nein, nicht alle für Bash bestimmten Skripte funktionieren mit Bindestrich. Eine Reihe von 'Bashism' funktioniert nicht im Bindestrich, wie z. B. der C-Stil für Schleifen und die Doppelklammer-Vergleichsoperatoren. Wenn Sie über eine Reihe von Bash-Skripten verfügen, die Sie für Dash verwenden möchten, können Sie Checkbashisms verwenden . Dieses Tool überprüft Ihr Skript auf Nur-Bash-Funktionen, die im Bindestrich wahrscheinlich nicht funktionieren.
quelle
#!/bin/sh
aber nicht funktioniert in/bin/sh
( zum Beispiel , weil es wurde geschrieben und läuft nur inbash
) sollte in Betracht gezogen wird gebrochen . Der einfachste Weg, solche Skripte zu reparieren, besteht darin, den Shebang durch#!/bin/bash
(oder#!/usr/bin/env bash
) zu ersetzen .bash
Funktionen abhängt , als solches und nicht als deklarieren solltensh
. Andernfalls funktioniert es einfach nicht auf einem System, mit dem keinesh
Verbindung bestehtbash
. Das Praktische ist, Ihre Skripte richtig zu schreiben und zu zeigen, damit sie tatsächlich funktionieren .Nicht einmal sh-Skripte sind mit dash kompatibel. Pkgsrcs Bootstrap, zum Beispiel.
quelle
dash -n
hat beim Ausführen von Bootstrap keine Fehler ergeben, aber das ist der naivste Test.dash
die nicht unterstützt wird. Möglicherweise mehr Dinge, aber die Liste ist sehr klein.local