Ich habe viele Shell-Skripte gehackt, und manchmal verblüffen mich die einfachsten Dinge. Heute bin ich auf ein Skript gestoßen, das ausgiebig Gebrauch von :
gemacht hat (Doppelpunkt) bash eingebaut.
Die Dokumentation scheint einfach genug:
: (a colon) : [arguments]
Tun Sie nichts, außer Argumente zu erweitern und Umleitungen durchzuführen. Der Rückgabestatus ist Null.
Ich habe dies jedoch bisher nur in Demonstrationen der Shell-Erweiterung verwendet gesehen. Der Anwendungsfall in dem Skript, auf das ich stieß, machte ausgiebigen Gebrauch von dieser Struktur:
if [ -f ${file} ]; then
grep some_string ${file} >> otherfile || :
grep other_string ${file} >> otherfile || :
fi
Es gab tatsächlich Hunderte von Greps, aber sie sind einfach mehr vom Gleichen. Abgesehen von der obigen einfachen Struktur sind keine Eingabe-/Ausgabeumleitungen vorhanden. Später im Skript werden keine Rückgabewerte überprüft.
Ich lese dies als ein nutzloses Konstrukt, das sagt „oder nichts tun“. Welchem Zweck könnte es dienen, diese Greps mit „or do nothing“ zu beenden? In welchem Fall würde dieses Konstrukt zu einem anderen Ergebnis führen, als einfach den || :
aus allen Instanzen?
Akzeptierte Antwort:
Es erscheint der :
s in Ihrem Skript werden anstelle von true
verwendet . Wenn grep
keine Übereinstimmung in der Datei findet, wird ein Exit-Code ungleich Null zurückgegeben; wie jw013 in einem Kommentar erwähnt, wenn errexit
gesetzt wird, wahrscheinlich durch -e
In der Shebang-Zeile würde das Skript beendet, wenn einer der grep
s keine Übereinstimmung finden. Das war eindeutig nicht das, was der Autor wollte, also fügte er || :
um den Exit-Status dieses bestimmten zusammengesetzten Befehls immer auf Null zu setzen, wie das (meiner Erfahrung nach) häufigere || true
/|| /bin/true
.