- Wenn es zwei oder mehrere Wege gibt, etwas zu erledigen, und einer davon kann in einer Katastrophe enden, so wird jemand diesen Weg wählen.
- -- Edward A. Murphy, jr.
In der Firma in der ich arbeite bin ich so ein bisschen ein Mädchen für alles was mit Unix zu tun hat. Gibt's Probleme welcher Art auch immer, sobald sie mit Unix zu tun haben, werde ich gerne um Rat und Meinung gefragt. Und genauso gerne antworte ich auch, auch wenn es gar nicht meine Baustelle ist.
Unter anderem habe ich mal an einem Makefile mit rumgebastelt. Dieses sollte, wenn eine Datei vorhanden ist, etwas tun. Wohl wissend, dass Makefiles böse sein können, war mein Vorschlag:
target:
[ ! -f <file> ] || <do something>
<do something else>
Um das leichter nachvollziehen zu können, hat ein Kollege daraus folgendes gemacht:
target:
[ -f <file> ] && <do something>
<do something else>
Warum ist meins nun gut und das meines Kollegen böse?
Wenn die Datei existiert funktioniert beides gleich gut, aber wenn die Datei nicht existiert, gibt es einen kleinen aber feinen Unterschied. In meinem Fall wird "<do something>" nicht ausgeführt und geht bei "<do something else>" weiter. Was auch so gemeint war. Nach der Änderung meines Kollegen brach der Kompiliervorgang an dieser Stelle mit einer Fehlermeldung ab. "Ja aber warum?" wird mich bestimmt jemand fragen wollen.
Hier ist die Antwort: der Kompiliervorgang bricht immer dann ab wenn ein Fehler auftritt. Nun löst "[ -f <file> ]" im Falle des nichtvorhanden seins von "<file>" einen Fehler aus, damit der Rest hinter "&&" nicht ausgeführt wird. Was zum einen gewollt ist, führt zum nicht gewollten Abbruch. Mein Vorschlag klappt hingegen, weil beim Nichtvorhandensein von "<file>" kein Fehler ausgelöst wird. Und er klappt auch dann, wenn die Datei existiert, weil der "Fehler" von dem Shellkonstrukt "||" abgefangen wird. Erst wenn "<do something>" einen Fehler auslöst, wird abgebrochen.
Gar nicht so doof, gelle?
P.S.: Alle Leute, die hier lesen und nichts mit Makefiles zu tun haben, bitte ich für dieses Posting um Entschuldigung. Das nächste wird nicht so technisch, versprochen. Genaugenommen ist dieses Posting eigentlich nur für den nächsten Kollegen, der in diese Falle tappt. :-)
Kommentare