Eingrenzen eines Patch-Problems, das ich zu beheben versuche: Nur zwei Dateien mit einer Größe von jeweils 1 Byte:
- Datei
a
(enthält'a'
) - Datei
b
(enthält'b'
) und
Ziel ist es, einen Patch zu erstellen und dann anzuwenden, der den Wert von 'b'
in ändert 'a'
. Inhalt von Makefile sind:
patch:
diff -u b a > b2a.patch
patch -o b.corrected b < b2a.patch
diff a b.corrected
clean:
rm -f b2a.patch b.corrected
In Anbetracht des oben make
Gesagten schlägt mit der folgenden Ausgabe fehl:
$ make
diff -u b a > b2a.patch
make: *** [patch] Error 1
Wenn ich jedoch die Befehle im Makefile nacheinander auf der Bash-Shell ausführe, gibt es überhaupt kein Problem.
exit code
von ,diff
wenn Sie es manuell ausführen?cp
? Da dies nicht wirklich sinnvoll ist, gehe ich davon aus, dass dies ein vereinfachter Testfall ist.Antworten:
Make geht davon aus, dass ein Exit-Code von 0 Erfolg bedeutet, alles andere bedeutet Misserfolg. Dies ist die Standardkonvention, die von fast allen Befehlszeilentools verwendet wird.
Ist leider
diff
keiner von denen. Wenn Sie die GNU Diff-Infoseite und auch den Eintrag "Diff" der Single Unix Specification überprüfen , bedeutet 0, dass keine Unterschiede gefunden wurden, 1 bedeutet, dass Unterschiede gefunden wurden, und ≥2 bedeutet, dass ein Fehler vorliegt.Sie können Make anweisen, den Beendigungsstatus vollständig zu ignorieren, indem Sie dem Befehl einen Bindestrich voranstellen, wie Sie es in Ihrem Kommentar getan haben. Dadurch werden jedoch tatsächliche Fehler ignoriert - wahrscheinlich nicht das, was Sie möchten. Stattdessen können Sie:
Beachten Sie das
; [ $$? -eq 1 ]
Bit, das ich am Ende der beiden Diff-Linien hinzugefügt habe. Sie können; test $$? -eq 1
natürlich auch verwenden. Die$?
Shell-Variable ist$$?
auf normale Makefile-Escape-Konventionen zurückzuführen. Beachten Sie, dass dies auch den Exit-Status 0 (keine Unterschiede) ablehnt, was wahrscheinlich das ist, was Sie wollen.Übrigens: Es scheint, dass dies wirklich sein sollte:
so dass Änderungen von a und b übernommen und die Dateien korrekt neu generiert werden.
quelle
diff
ist ein Beispiel dafür, wie sindgrep
,test
...diff
würde fragen " Sind diese Dateien unterschiedlich?" ... Wohl ist diff rückwärts. Aber ich denke, sowohl es als auchcmp
beide geben 0 für Match zurück, 1 für Unterschied.diff
undcmp
fragen Sie " Sind diese Dateien identisch?"