Shell-status-codes machen
Nutze ich ein Makefile (mit GNU-make unter Linux) zu automatisieren meine Routinearbeit bei der Umgestaltung ein Python-Skript.
Das Skript erzeugt eine Ausgabe-Datei, und ich möchte sicherstellen, dass die Ausgabe-Datei bleibt unverändert im Gesicht meiner refactorings.
Allerdings habe ich keine Möglichkeit gefunden, um den status-code eines Befehls auf eine spätere shell if-Befehl.
Die folgende Regel zeigt das problem:
check-cond-codes:
diff report2008_4.csv report2008_4.csv-save-for-regression-testing; echo no differences: =$$!=
diff -q poalim report2008_4.csv; echo differences: =$$!=
Die ersten, die 'diff' vergleicht zwei gleiche Dateien, und die zweite vergleicht zwei unterschiedliche Dateien.
Die Ausgabe ist:
diff report2008_4.csv report2008_4.csv-save-for-regression-testing; echo no differences: =$!=
no differences: ==
diff -q poalim report2008_4.csv; echo differences: =$!=
Files poalim and report2008_4.csv differ
differences: ==
So offensichtlich '$$!' ist die falsche variable zur Erfassung der status-code von 'diff'.
Auch mit
SHELL := /bin/bash
am Anfang der Makefile hat das problem nicht lösen.
Einer variable die Rückgabe ist der Wert, die ich brauchen würde (wenn es überhaupt existiert) verwendet werden, in einem 'if' - Befehl in die eigentliche Regel.
Die alternative der Schaffung eines kleinen ad-hoc-shell-Skript anstelle des Schreibens alle Befehle, die inline in der Makefile ist unerwünscht, aber ich verwende es als letzten Ausweg.
Verwandte:
InformationsquelleAutor der Frage Omer Zak | 2009-04-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, Sie suchen für die
$?
shell-variable, und gibt den exit-code des vorherigen Befehls. Zum Beispiel:Verwenden Sie diese in Ihrem makefile, würden Sie haben zu entkommen der
$
wie in$$?
:Tun, beachten Sie, dass jeder Befehl in der Regel Körper machen, ist die Ausführung in einer separaten subshell. Zum Beispiel funktioniert das folgende nicht:
Weil die
diff
und dieif
Befehle sind ausgeführt in verschiedenen shell-Prozesse. Wenn Sie möchten, verwenden Sie die output-status-Befehl, müssen Sie dies im Rahmen der gleichen Schale, wie in meinem vorherigen Beispiel.InformationsquelleAutor der Antwort Eric Melski
Benutzen Sie '$$?' anstelle von '$$!' (vielen Dank an die 4. Antwort von Ausfahrt Shell-Skript, Basierend auf der Prozess-Exit-Code)
InformationsquelleAutor der Antwort Omer Zak
Vergessen Sie nicht, dass jeder Ihrer Befehle ausgeführt wird, in getrennte Unterschalen.
Das ist, warum Sie oft so etwas wie:
Und beim Debuggen, nicht zu vergessen die jeder hilfreiche option-n, die gedruckt werden die Kommandos aber nicht ausgeführt und die option-p zeigen Sie der kompletten Umgebung, einschließlich, wo die verschiedenen bits und Stücke, die gesetzt wurden.
HTH
cheers,
InformationsquelleAutor der Antwort Rob Wells
Wenn Sie übergeben das Ergebnis von code auf ein
if
Sie könnte einfach tun:InformationsquelleAutor der Antwort Timothy Gu
Die bash-variable ist
$?
aber warum tun Sie ausdrucken möchten den status-code überhaupt?InformationsquelleAutor der Antwort David Z
Versuchen `\$?' Ich denke, die $$ wird interpretiert, indem die makefile
InformationsquelleAutor der Antwort Charlie Martin