Verständnisproblem oder Fehler in bash und ksh?
Hi Liste, ich bin gerade dabei, mir ein kleines Skript zu schreiben und bin dabei über ein Verhalten gestolpert, das ich mir nicht erklären kann und für falsch halte! Folgende Situation: Ich habe 2 Dateien ("ifcfg-eth0-all" und "ifcfg-eth0-base"), die ich als Original für die Datei "/etc/sysconfig/network/ifcfg-eth0" verwenden will. Dazu prüfe ich dann durch das folgenden Skript, ob eben diese Datei von anderer Stelle aus geändert wurde. Ich nahm eigentlich an, daß diff "true" (=0) zurück gibt, wenn die Dateien gleich sind. Dementsprechend müßte dann ein "!" (nicht) vor das Kommando in der IF-Bedingung. Dann erhalte ich aber immer: "someone changed the file" (Kopie entspricht NICHT einer der beiden Originale, ist also keine Kopie). Die Kopie ist aber tatsächlich eine Kopie einer der anderen beiden Dateien und sollte dementsprechend "true" ergeben, was es auch tut. Damit müßte ich aber den bedingten Ausdruck negieren ("!"), was dann aber nicht funktioniert. Hätte vielleicht jemand eine Idee, wieso? ---------------------- Start of Skript --------------------- #!/bin/bash CFGDIR=/etc/sysconfig/network CFGNAM=ifcfg-eth0 SRCDIR=/root/bin ALLNAM=ifcfg-eth0-all BASNAM=ifcfg-eth0-base # Testausgaben für die einzelnen Teile diff -q $CFGDIR/$CFGNAM $SRCDIR/$ALLNAM >/dev/null echo "$ALLNAM: $?" diff -q $CFGDIR/$CFGNAM $SRCDIR/$BASNAM >/dev/null echo "$BASNAM: $?" [ `diff -q $CFGDIR/$CFGNAM $SRCDIR/$BASNAM >/dev/null || diff -q $CFGDIR/$CFGNAM $SRCDIR/$ALLNAM >/dev/null` ] echo "[ $? ]" if [ `diff -q $CFGDIR/$CFGNAM $SRCDIR/$ALLNAM >/dev/null || diff -q $CFGDIR/$CFGNAM $SRCDIR/$BASNAM >/dev/null` ] then echo "$CFGDIR/$CFGNAM: unknwon version - someone changed the file" exit 1 fi echo Ok so far exit 0 ---------------------- End of Skript --------------------- Grüße Martin -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am 17.07.2011 um 12:46 schrieb Martin Deppe:
Ich nahm eigentlich an, daß diff "true" (=0) zurück gibt, wenn die Dateien gleich sind.
Nein. Ein Progamm sollte(!) immer dann 0 zurückgeben, wenn es sich fehlerlos beendet hat. Deswegen wird auch diff immer 0 zurückliefern, sofern es erfolgreich beendet wurde. Rainer-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am 17.07.2011 13:44, schrieb Rainer Sokoll:
Am 17.07.2011 um 12:46 schrieb Martin Deppe:
Ich nahm eigentlich an, daß diff "true" (=0) zurück gibt, wenn die Dateien gleich sind.
Nein. Ein Progamm sollte(!) immer dann 0 zurückgeben, wenn es sich fehlerlos beendet hat. Deswegen wird auch diff immer 0 zurückliefern, sofern es erfolgreich beendet wurde.
Rainer--
Hi Rainer, danke für Deine Antwort, allerdings gibt diff einen exitcode != 0 zurück, wenn die zu vergleichenden Dateien Unterschiede enthalten. Wie mir mittlerweile wieder aufging, lag mein Fehler darin begraben, daß ich den exit-code nicht direkt in einer nachfolgenden if-Abfrage verwenden kann, sondern ihn mir erst über z.B. "RC=$?" verfügbar machen muß, da direkt die Ausgabe von <stdout> des Prozesses ankommt. Ich habe es aber sowieso jetzt über "cmp" gelöst, da ich dort, im Gegensatz zu "diff", die stdout-Ausgabe abschalten kann (-s). Trotzdem Danke für die Antwort. und Gruß Martin -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am 17.07.2011 um 14:22 schrieb Martin Deppe:
danke für Deine Antwort, allerdings gibt diff einen exitcode != 0 zurück, wenn die zu vergleichenden Dateien Unterschiede enthalten.
Potztausend, ja, Du hast Recht. Habe ich nicht nachgeprüft - wie peinlich :-( Danke für die Richtigstellung, Rainer-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Sun, 17 Jul 2011, Martin Deppe schrieb:
Ich nahm eigentlich an, daß diff "true" (=0) zurück gibt, wenn die Dateien gleich sind. Dementsprechend müßte dann ein "!" (nicht) vor das Kommando in der IF-Bedingung. Dann erhalte ich aber immer: "someone changed the file" [..] # Testausgaben für die einzelnen Teile diff -q $CFGDIR/$CFGNAM $SRCDIR/$ALLNAM >/dev/null echo "$ALLNAM: $?" diff -q $CFGDIR/$CFGNAM $SRCDIR/$BASNAM >/dev/null echo "$BASNAM: $?"
Hier bekommst du 0/1 je nach Differenz, richtig? Und du bekommst keine Ausgabe.
[ `diff -q $CFGDIR/$CFGNAM $SRCDIR/$BASNAM >/dev/null || diff -q $CFGDIR/$CFGNAM $SRCDIR/$ALLNAM >/dev/null` ] echo "[ $? ]"
Hier bekommst du immer 1. Warum? Darum: test `true`; echo $? test `false`; echo $? test ""; echo $? Du testest den leeren String. Und der ist eben "falsch". ==== help test ==== -n STRING STRING True if string is not empty. ==== Das 'if test' ist bei sowas schlicht flasch. Korrekt ist: if ! diff -q .. >/dev/null && ! diff -q .. >/dev/null; then echo "$CFGDIR/$CFGNAM: unknwon version - someone changed the file" [..] Aber bei sowas ist 'cmp -s' sowieso einfacher. if ! cmp -s $CFGDIR/$CFGNAM $SRCDIR/$ALLNAM && \ ! cmp -s $CFGDIR/$CFGNAM $SRCDIR/$BASNAM; then HTH, -dnh -- Most people do not see the world as it is. They see it as they are. -- Anna, Anna and the King -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am 17.07.2011 21:33, schrieb David Haller:
Hallo,
Am Sun, 17 Jul 2011, Martin Deppe schrieb:
[..]
# Testausgaben für die einzelnen Teile diff -q $CFGDIR/$CFGNAM $SRCDIR/$ALLNAM >/dev/null echo "$ALLNAM: $?" diff -q $CFGDIR/$CFGNAM $SRCDIR/$BASNAM >/dev/null echo "$BASNAM: $?"
Hier bekommst du 0/1 je nach Differenz, richtig? Und du bekommst keine Ausgabe.
[ `diff -q $CFGDIR/$CFGNAM $SRCDIR/$BASNAM >/dev/null || diff -q $CFGDIR/$CFGNAM $SRCDIR/$ALLNAM >/dev/null` ] echo "[ $? ]"
Hier bekommst du immer 1. Warum? Darum:
test `true`; echo $? test `false`; echo $? test ""; echo $?
Du testest den leeren String. Und der ist eben "falsch".
==== help test ==== -n STRING STRING True if string is not empty. ====
Das 'if test' ist bei sowas schlicht flasch. Korrekt ist:
if ! diff -q .. >/dev/null && ! diff -q .. >/dev/null; then echo "$CFGDIR/$CFGNAM: unknwon version - someone changed the file" [..]
Aber bei sowas ist 'cmp -s' sowieso einfacher.
if ! cmp -s $CFGDIR/$CFGNAM $SRCDIR/$ALLNAM && \ ! cmp -s $CFGDIR/$CFGNAM $SRCDIR/$BASNAM; then
HTH, -dnh
Hi David, super, danke Dir! Beste Grüße Martin -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (3)
-
David Haller
-
Martin Deppe
-
Rainer Sokoll