PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehlerausgabe nach /dev/null umleiten



-eraz-
11.02.15, 11:54
Ansich wäre die Anforderung lt. Titel ja nix großartiges. Aber in diesem Fall will es irgendwie nicht klappen. Ich rechne mir in einem Skript das Alter eines Files aus, der Code hierfür sieht so aus:


DIFF=$(($(date +%s) - $(stat --format "%Y" $FILE)))

Soweit so gut. Es kann aber vorkommen, dass das File zu diesem Zeitpunkt garnicht mehr existiert. Um nun unnötige Fehlermeldungen zu vermeiden, möchte ich das alles was hier Fehler erzeugen könnte, nicht ausgegeben wird. Das ist zum einen:

1.) Das File wird nicht gefunden. Fehlermeldung: stat: cannot stat `sf': No such file or directory
2.) Die Bash hat nix zu rechnen. Fehlermeldung: bash: 1423648144 - : syntax error: operand expected (error token is "- ")

Ersteres lässt sich so lösen:

DIFF=$(($(date +%s) - $(stat --format "%Y" $FILE 2>/dev/null)))

Aber irgendwie will es nicht klappen, dass auch die bash den Mund hält?

nopes
11.02.15, 12:18
Warum steckst du das nicht in einfach in Variablen und prüfst vernünftig (natürlich kannst du auch erst vernünftig prüfen und erst starten, wenn alles passt)?

-eraz-
11.02.15, 12:31
Weiß jetzt nicht genau was du meinst? Kannst du mir mal ein Beispiel geben?

marce
11.02.15, 13:40
ich würde auch die Variablen-Variante bevorzugen - aber grundlegend könntest Du auch dem "problematischen" Rückgabewert von stat einfach eine 0 voranstallten (oder anderweitig zu einer Zahl "casten")

nopes
11.02.15, 14:32
etwa so meinte ich

if [ ! -e $FILE ]; then
echo "File ${FILE} does not exists!"
exit 0;
fi
DIFF=$(($(date +%s) - $(stat --format "%Y" $FILE 2)))
oder so

if [ ! -e $FILE ]; then
echo "File ${FILE} does not exists!"
exit 0;
fi
DATE1=`date +%s`
DATE2=`stat --format "%Y" $FILE`
DIFF=$(($DATE1 - $DATE2))

-eraz-
11.02.15, 18:29
Achso... ja das geht so leider nicht. Diese Abfrage gibt es in so ähnlicher Form schon.

Zuerst schaut ein if ob Files da sind und dann arbeitet eine "for FILE in ..." Schleife das Directory ab. Da die Files dort aber sehr "flüchtig" sind, kann es passieren, dass es schon verschwunden ist bis die Schleife beim betreffenen File angekommen ist (klingt jetzt vielleicht seltsam, aber um genauer zu erklären warum das so ist müsste ich weit ausholen).

D.h. die Rechnung muss irgendwie zum Schweigen gebracht werden. :)

@Mace
Vielleicht stell ich mich jetzt blöd an, aber ich verstehe nicht ganz. Hast du da vll auch ein kleines Beispiel für mich?

/edit
Wenn ich so überlege: Ich könnte da vor dem stat vll schon nocheinmal ein if einbauen. Aber ich kann da nicht einfach einen exit einbauen, da das Ganze ja in einer Schleife läuft und ja trotzdem noch weiterhin was zu tun ist. Kann ich der Schleife irgendwie sagen, es soll diesen einen Durchlauf überspringen?

Grundsätzlich glaube ich aber, das Ding zum Schweigen zu bringen ist besser. Der Vorgang läuft täglich ein paar tausend mal ab, da kommt es wahrscheinlich hin und wieder vor, dass genau zwischen dem if und dem stat ein File verschwindet. Dann hätte ich damit auch nix gewonnen.

nopes
11.02.15, 18:39
Dann unterdrücke den Fehler bei stat, das hast du ja schon, lenke die Ausgabe vor dem Diff in eine Variable, prüfe die Variable und diffe nur, wenn da was plausibles drin ist; 0 davor ist tückisch, ping 192.168.100.010 ist was anders als ping 192.168.100.10 (Oktal-Magie - passend wäre dann 192.168.100.012).

Efraim
11.02.15, 23:23
STAT=$(stat --format "%Y" $FILE 2>/dev/null) && DIFF=$(($(date +%s) - $STAT))

;)

nopes
11.02.15, 23:27
wow, immer wieder erstaunlich wie viel Logik in eine Zeile passt; wirklich schick und auch leicht zu verstehen :)

Efraim
12.02.15, 10:21
Das kann man natürlich auch besser lesbar formulieren:

if STAT=$(stat --format "%Y" $FILE 2>/dev/null)
then
DIFF=$(($(date +%s) - $STAT))
fi


Nur mal so am Rande: Was Du da tust, sieht mir irgendwie nach einer einfachen Aufgabe für find -mtime aus.

-eraz-
12.02.15, 17:47
Cool, danke! :-)

Was ich nicht ganz verstehe: Warum wird kein Fehler ausgegeben wenn das Ganze in eine Variable gepackt wird? Das kannte ich nicht...

marce
12.02.15, 17:54
naja, dass diff wird ja nur ausgeführt, wenn das Zuweisen erfolgreich war.

Efraim
12.02.15, 21:33
Jupp. Ich habe nur komprimiert, was schon gepostet wurde.

-eraz-
13.02.15, 08:29
Achso stimmt, er würde ja an der Stelle abbrechen.... Danke für den Input!