2014-04-01 15 views
5

Ich studiere System V Init-Skripte in/etc/init.d/ in aktuellen Debian 7.4.0 Wheezy Release (Aber es ist auch in anderen, früheren, Releases). Fast alle von ihnen (aus vorhandenen Diensten), die in diesem Ordner gefunden wurden, enden mit einer leeren Zeile, die nur ein Doppelpunkt (:) enthält. Sogar die 'Skelett'-Vorlagendatei, die dort zu dem Zweck zu finden ist, eigene Init-Skripte zu schreiben, hat dies. Hier ist eine Copy/Paste aus dem Ende des Codes:Shell-Skript endet mit einer Zeile, die nur einen Doppelpunkt enthält?

esac 

: 

(das war das Ende einer case-Anweisung und dann gibt es das Ende der Datei)

Was auch interessant ist, ist, dass es ist kein Ausgang 0 oder Ausgang $? Call, außer nur in einigen Bedingungen in der Case-Anweisung, die sonst genannt werden würde, so scheint es, als ob das Doppelpunkt-Zeichen eine Art Ersatz dafür ist? Vollständige Skelett-Datei-Code ist hier: https://gist.github.com/ivankovacevic/9917139

Was könnte dieser Doppelpunkt sein und warum?

+4

':' a builtin, die 'true' in bash auswertet, so dass ich vermute, das' $ zurückgesetzt ist 'auf 0 –

Antwort

4

Der Doppelpunkt ist ein syntaktisches Element, das im Wesentlichen nichts tut, aber wahr zurückgibt. Es kann überall dort verwendet werden, wo ein Befehl verwendet werden kann.

Es wird manchmal benötigt, wo sh (1) eine Anweisung benötigt. Zum Beispiel ergibt dies einen Fehler:

if [ "$a" = "" ] ; then 
    # comment out this part for now 
    # echo yes 
else 
    echo no 
fi 

bash: Syntaxfehler in der Nähe von unerwartetem Token `else‘

den Kommentars mit einem Austausch: es macht die Arbeit:

if [ "$a" = "" ] ; then 
    # comment out this part for now 
    : echo yes 
else 
    echo no 
fi 

Es wird selten benötigt verwende ausdrücklich "exit 0" in der Shell; in Ermangelung einer Exit-Anweisung verlässt das Shell-Skript mit dem Status des letzten Befehls, ein Shell-Skript, das

/bin/false 

führt gerade wird ein Exit-Status 1 geben:

$ echo $? 
1 

Der Doppelpunkt ist weitgehend schwarze Magie, und ich habe aus Experimenten gelernt, was ich davon weiß.

+1

warum nicht? Rufen Sie am Ende des Skripts den Exit 0 auf, anstatt sich mit dem Verstand zu beschäftigen: ...Oder gibt es einen wirklichen Vorteil bei der Verwendung eines Doppelpunkts über Exit 0 –

+1

Ich stimme @Ivan Kovacevic: Lesbarkeit wird durch explizite über den Ausgangswert verbessert, so schreibe ich immer "Exit 0", wenn ich ein Skript benötigen, um einen Erfolgsstatus zurückzugeben. Das heißt, man sollte nur 'exit 0' verwenden, wenn man eigentlich einen Fehlerstatus überschreiben will, weil der Fehlerstatus aus einem bestimmten Grund zurückgegeben wird. – BertD

+1

Der Doppelpunkt hat einen vertretbaren Vorteil: Er erzeugt einen Exit-Status von 0, ohne zwischen 'exit' und' return' zu wählen (nützlich, wenn ein Skript ausgeführt wird * oder * sourced; 'exit' aus einer Quelldatei ist unwahrscheinlich wünschenswert sein, und 'return' von einem Skript ist ein Fehler. In diesen Tagen sollte das besser lesbare 'true' anstelle des archaischen': 'zu diesem Zweck zur Verfügung stehen. – chepner

1

Die : gibt True-Status in BASH zurück und ist nur ein Ersatz für das Wort true. Ich sehe keinen Nutzen für die Verwendung von : als exit 0 am Ende eines System-Init-Skript anders als zum Speichern von Zeichen oder machen es weniger lesbar.

Als chepner Punkt aus, : würde einen wahren Status sicherstellen, ohne die Shell zu verlassen, wenn das Skript stammt.

Es wird auch häufig verwendet, um die logische Negation mit ! in Anweisungen zu ersetzen.

if [[ $var ]]; then 
    : 
else 
    echo no 
fi 

ist das gleiche wie:

if ! [[ $var ]]; then 
    echo no 
fi 
+1

Wenn das Skript bereitgestellt werden kann (oder muss), beendet 'exit 0' die Shell, die das Skript bereitgestellt hat, nicht nur das Skript. – chepner