So schreiben Sie stderr auf den Bildschirm und schreiben BOTH stderr und stdout in eine Datei - UND lassen die Zeilen für stderr und stdout in derselben Reihenfolge erscheinen, in der sie geschrieben würden, wenn beide auf den Bildschirm geschrieben würden:
Es stellt sich als schwieriges Problem heraus, insbesondere der Teil über "dieselbe Sequenz", den Sie erwarten würden, wenn Sie sie einfach auf den Bildschirm schreiben würden. Einfach ausgedrückt: Schreiben Sie jede Zeile in eine eigene Datei, markieren Sie jede Zeile (in jeder Datei) mit der genauen Uhrzeit, zu der die Zeile erstellt wurde, und führen Sie dann Folgendes aus: , aber um BEIDE "stderr" und "stdout" nacheinander zu sehen, sortieren Sie die beiden Dateien (mit exakten Zeitmarkierungen in jeder Zeile) zusammen.
Code:
# Set the location of output and the "first name" of the log file(s)
pth=$HOME
ffn=my_log_filename_with_no_extension
date >>$pth/$ffn.out
date >>$pth/$ffn.err
# Start background processes to handle 2 files, by rewriting each one line-by-line as each line is added, putting a label at front of line
tail -f $pth/$ffn.out | perl -nle 'use Time::HiRes qw(time);print substr(time."0000",0,16)."|1|".$_' >>$pth/$ffn.out.txt &
tail -f $pth/$ffn.err | perl -nle 'use Time::HiRes qw(time);print substr(time."0000",0,16)."|2|".$_' >>$pth/$ffn.err.txt &
sleep 1
# Remember the process id of each of 2 background processes
export idout=`ps -ef | grep "tail -f $pth/$ffn.out" | grep -v 'grep' | perl -pe 's/\s+/\t/g' | cut -f2`
export iderr=`ps -ef | grep "tail -f $pth/$ffn.err" | grep -v 'grep' | perl -pe 's/\s+/\t/g' | cut -f2`
# Run the command, sending stdout to one file, and stderr to a 2nd file
bash mycommand.sh 1>>$pth/$ffn.out 2>>$pth/$ffn.err
# Remember the exit code of the command
myexit=$?
# Kill the two background processes
ps -ef | perl -lne 'print if m/^\S+\s+$ENV{"idout"}/'
echo kill $idout
kill $idout
ps -ef | perl -lne 'print if m/^\S+\s+$ENV{"iderr"}/'
echo kill $iderr
kill $iderr
date
echo "Exit code: $myexit for '$listname', list item# '$ix', bookcode '$bookcode'"
Ja, dies scheint aufwendig zu sein und führt zu 4 Ausgabedateien (von denen Sie 2 löschen können). Es scheint, dass dies ein schwer zu lösendes Problem ist, daher waren mehrere Mechanismen erforderlich.
Um die Ergebnisse von BOTH stdout und stderr in der erwarteten Reihenfolge zu sehen, führen Sie Folgendes aus:
cat $pth/$ffn.out.txt $pth/$ffn.err.txt | sort
Der einzige Grund, warum die Sequenz zumindest sehr nahe an dem liegt, was wäre, wenn sowohl stdout als auch stderr einfach auf dem Bildschirm angezeigt worden wären, ist: Jede einzelne Zeile ist bis zur Millisekunde mit einem Zeitstempel versehen.
Gehen Sie wie folgt vor, um stderr im Verlauf des Vorgangs auf dem Bildschirm anzuzeigen:
tail -f $pth/$ffn.out
Hoffe das hilft jemandem, der hier lange angekommen ist, nachdem die ursprüngliche Frage gestellt wurde.