
Ich habe das folgende Bash-Shell-Skript, das in 90 % der Fälle das Erwartete tut, manchmal aber auch nicht. Das Problem liegt an der Platzierung von Datum und Uhrzeit. Wie gezeigt habe ich dem Programm gesagt, dass es date
am Ende von anhängen screenlog.0
soll. Meistens passiert das richtig. Manchmal werden Datum und Uhrzeit jedoch an das angehängt.Anfangvon screenlog.0
. Das ist wirklich problematisch, da das Format von screenlog.0
bestimmten Richtlinien entsprechen muss. Für jede Hilfe wäre ich dankbar.
#!/bin/bash
...
...
if grep -q "dicounter_${string1}_from_${string2}" MasterFile.txt || [ -e "dicounter_${string1}_from_${string2}" ];
then
echo "dicounter_${string1}_from_${string2} already exists in the MasterFile or the current directory. Would you like to proceed?"
read string3
if [[ "${string3^}" == 'Y' ]]; then
echo "How many times has this dicounter been retested? (e.g. 1 for first time, 2 for the second, ...)"
read string4
screen -S trans -L /dev/ttyACM0
screen -S trans -X stuff 's'$(echo -ne '\015')
sleep 8s
screen -S trans -X quit
date +%F~%H:%M:%S >> screenlog.0
mv screenlog.0 dicounter_${string1}_from_${string2}~${string4}
else
exit 0
fi
else
#opening screen & begin analysis
screen -S trans -L /dev/ttyACM0
screen -S trans -X stuff 's'$(echo -ne '\015')
sleep 8s
screen -S trans -X quit
date +%F~%H:%M:%S >> screenlog.0
mv screenlog.0 dicounter_${string1}_from_${string2}
fi
Im Wesentlichen soll das Programm schauen, ob das dicounter_..._from_...
schon vorhanden ist und wenn nicht, oder wenn der Benutzer einen weiteren Testlauf wünscht, weitermachen und sich mit einem Sender verbinden und Daten aufnehmen. Am Ende screenlog.0
wird eine Datei erstellt, an die ich am Ende Datum und Uhrzeit anhängen möchte. Anschließend umbenennen.
Antwort1
Es scheint, dass der Bildschirmbefehl „Beenden“ vor dem Leeren des Protokolls zurückgegeben wurde. Das Hinzufügen einer Verzögerung zwischen dem letzten Bildschirmbefehl und dem Datumsstempel sollte dem Bildschirm Zeit geben, das Schreiben in das Protokoll abzuschließen. Eine andere Möglichkeit wäre, eine „Busy“-Schleife zu verwenden, um zu warten, bis das Protokoll geschrieben wurde:
...
screen -S trans -X quit
while [ ! -s screenlog.0 ]
do
sleep 1
done
date +%F~%H:%M:%S >> screenlog.0
...