stdin UND stderr umleiten: Wo liegt hier der Fehler?

29/04/2008 - 18:49 von Peter Mairhofer | Report spam
Hi,

Ich habe ein Backupscript gschrieben welches Scripts in der Form
backup.d/S*.sh startet. Dabei geben die Scripts spezielle Werte
zurueck, z.B. 0=OK, 1=Skipped, sonstiges=Fehler. Ich moechte nun
aber auch, dass ALLE Ausgaben der Scripts eine Logdatei geschrieben
werden. Die normale Ausgabe (die dann per cron verschickt wird)
soll dann nur mehr die Zusammenfassung und den Status enthalten.

Hier ist ein Teil des Scripts:

for i in $backup_d/S*
do
if [ -x $i ]
then
echo -n "Running $i..."

start=`date '+%s'`
$i 2>&1 >>$LOG
ret=$?
end=`date '+%s'`

case "$ret" in
0)
echo -n "OK"
;;
1)
echo -n "skipped"
;;
*)
echo -n "FAILED"
;;
esac

t=$(( $end - $start ))

echo -n " [ "
print_dauer $(( $end - $start ))
echo " ]"

fi
done

Nun kommt es aber haeufig vor, dass dennoch Meldungen durchrutschen
und ich dann im Mail, das ich per cron erhalte z.B. folgendes steht:


[...]
Running S40home.sh...OK [ 00:21:38 ]
Running S41home_acls.sh...OK [ 00:08:19 ]
Running S45config.sh...tar: Entferne fàŒhrende »/« von Elementnamen
OK [ 00:00:02 ]
Running S60etc.sh...OK [ 00:00:10 ]
[...]

Das ist nicht sehr schoen, ich moechte, dass die Meldung von tar
in der Logfile landet.

Was aber ist an

$i 2>&1 >>$LOG

falsch?

lg,
Peter
 

Lesen sie die antworten

#1 Paul Hink
29/04/2008 - 19:24 | Warnen spam
Peter Mairhofer wrote:

Ich moechte nun aber auch, dass ALLE Ausgaben der Scripts eine
Logdatei geschrieben werden.

[...]

Was aber ist an

$i 2>&1 >>$LOG

falsch?



Die Reihenfolge:

| $ ( echo OUT; echo ERR >&2 ) 2>&1 >/dev/null
| ERR
| $ ( echo OUT; echo ERR >&2 ) >/dev/null 2>&1
| $

Siehe auch bash-Manpage:

| Note that the order of redirections is significant. For example, the
| command
|
| ls > dirlist 2>&1
|
| directs both standard output and standard error to the file dirlist,
| while the command
|
| ls 2>&1 > dirlist
|
| directs only the standard output to file dirlist, because the
| standard error was duplicated as standard output before the standard
| output was redirected to dirlist.

Ähnliche fragen