Das Programm wird nicht wie erwartet ausgeführt

Das Programm wird nicht wie erwartet ausgeführt

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 dateam Ende von anhängen screenlog.0soll. 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.0bestimmten 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.0wird 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
...

verwandte Informationen