PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : if [ `diff datei1 datei2` ]; funzt nicht



BLUESCREEN3D
27-06-2003, 14:27
folgendes shell-script soll etwas tun, sobald zwei dateien unterschiedlich sind:


if [ `diff datei1 datei2` ]; then
echo "bla";
fi

falls die dateien nun aber unterschiedlich sind, werden alle verschiedenen zeilen in die eckigen klammern gepackt und das wird wegen zu vielen argumenten nicht interpretiert...

gibt es eine möglichkeit, statt der ausgabe des befehls den rückgabe-wert einzusetzen, oder das irgendwie anders zu lösen?

pitu
27-06-2003, 15:03
diff file1 file2 > /dev/null 2>&1
if [ "$?" = "1" ]; then
echo "blah"
fi


gruss,
pitu

Jasper
27-06-2003, 16:33
Original geschrieben von BLUESCREEN3D
gibt es eine möglichkeit, statt der ausgabe des befehls den rückgabe-wert einzusetzen, oder das irgendwie anders zu lösen?

klar. geht ganz einfach:

if diff datei1 datei2 >/dev/null; then
...
fi

diff hat mehrere rückkehrcodes: 0 = keine unterschiede, 1 = unterschiede, 2 = fehler

such dir das passende aus.

-j

BLUESCREEN3D
27-06-2003, 16:44
Original geschrieben von pitu


diff file1 file2 > /dev/null 2>&1


kann man das nicht mit "diff file1 file2 2> /dev/null" abkürzen

pitu
27-06-2003, 17:09
Du hast mehrere ... nennen wir es pipes.

STDIN ist sozusagen 0
STDOUT ist 1
STDERR ist 2

Wenn du es nur mit 2>/dev/null machst, werden zwar alle Fehlermeldungen (STDERR) nach /dev/null geschrieben, aber nicht die normale Ausgabe (STDOUT).

Bei diesem Beispiel wird die normale Ausgabe (STDOUT=1) nach /dev/null umgeleitet, da du die ja nicht auf dem Schirm haben willst. die 1 muss man in diesem Fall nicht expliziet angeben, ansonsten hiesse es 1>/dev/null.

Ausserdem wird SDTERR nach STDOUT umgeleitet (2>&1) damit verschwindet es dann ebenfalls in /dev/null, da STDOUT ja dorthin umgeleitet wird. Das & bedeutet nur, dass du die Augabe nicht in ein File "1" umleitest.

gruss,
pitu

BLUESCREEN3D
27-06-2003, 18:20
Jaspers Post hab ich ja ganz übersehen - sowas wollte ich haben ^^

@pitu, das mit de stdou, stderr usw. kenn ich, aber darum geht es doch garnicht - ich meine nur, dass man deinen befehl auch mit einem einfachen "&>" abkürzen kann...

pitu
27-06-2003, 22:20
achso, sorry ;)

Du hast recht, natuerlich kann man es auch abkuerzen, aber ich persoenlich halte das fuer eine stilfrage, so wie



for i in *; do




for i in *
do


wuensche dir eine gute nacht, man liest sich

gruss,
pitu

BLUESCREEN3D
27-06-2003, 22:27
Original geschrieben von pitu
achso, sorry ;)

Du hast recht, natuerlich kann man es auch abkuerzen, aber ich persoenlich halte das fuer eine stilfrage

das kenn ich :)

z.B. bei C++ kann ich mir nicht erklären, warum die meisten Leute sowas wie

int main() {
cout << "hello, world" << endl;
}
machen, anstatt die zusammengehörigen Klammern eines Blockes übersichtlich untereinander zu setzen:

int main()
{
cout << "hello, world" << endl;
}

Jasper
28-06-2003, 00:11
Original geschrieben von pitu


diff file1 file2 > /dev/null 2>&1
if [ "$?" = "1" ]; then
echo "blah"
fi



das ist besser:

if [ $? -eq 1 ]; then
echo "blah"

"=" ist für stringvergleiche. dein beispiel klappt zwar meistens, aber halt nicht immer (führende/nachfolgende leerzeichen)

-j

pitu
29-06-2003, 22:01
Original geschrieben von BLUESCREEN3D
das kenn ich :)

z.B. bei C++ kann ich mir nicht erklären, warum die meisten Leute sowas wie

int main() {
cout << "hello, world" << endl;
}
machen, anstatt die zusammengehörigen Klammern eines Blockes übersichtlich untereinander zu setzen:

int main()
{
cout << "hello, world" << endl;
}

Das kann ich dir erklaeren. Das haengt von der logischen Betrachtungsweise des Codes ab.

Die erste Betrachtungsweise ist dem nachempfunden, wie du es auch selber gesagt hast, dass nach dem "if" entweder ein einzelner Befehl, oder ein gesammter Block kommt. Du fasst also bei dieser Betrachtungsweise den Block als solches in einer logischen, gemeint ist formatier, Strucktur, die dem Kontrollbefehl folgt.. Die Klammer beginnen und schliessen damit den Block.
Zu vergleichen ist das in etwa mit folgendem Shell-konstrukt:


for i in *
do
irgendetwas
done

Hier wird das do vom done geschlossen und entspricht damit deinem zweiten, favorisierten Konstrukt.


Ich persoenlich favoriesiere das Konstrukt deines erstn Beispiels. Hierbei ist die Sichtweise auf das Kontrollelement ausgerichtet. Das heisst, dass ich mit dem Kontrollelement, wenn es zutrifft, etwas starte und ich daher die durchfuehrung des Kontrollelements schliesse. Dies entspreich folgendem Shellkonstrukt:


if [ $i -eq 0 ]; then
irgendetwas
fi

(gruss an jasper ;) )
Wie du hier sehr leicht sehen kannst, wird hier wirklich das if mit dem fi geschlossen.

Ich benutzer Syntaxhighlighting, und wenn ich di klammer darueber schreibe, dann habe ich in der Zeile in der der Block anfaengt ein highlighting, und damit einfach von der Sichtweise her die dazugehoerige Kontrollstruktur.

Oder mit anderen Worten, bei der einen sichtweise gehoeren Kontrollelement und Block untrennbar zusammen und in der anderen Sichtweise folgt der Block einem Kontrollelement.
Sichtweise rein formatierungstechnisch gesehen.

gruss,
pitu