Ich arbeite an einem Shell-Skript, das bestimmte Änderungen an einer txt-Datei nur dann vornimmt, wenn sie vorhanden ist. Diese Testschleife funktioniert jedoch nicht. Ich frage mich, warum. Danke dir!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Antworten:
Wenn Sie sagen "funktioniert nicht", woher wissen Sie, dass es nicht funktioniert?
Sie können versuchen, herauszufinden, ob die Datei tatsächlich vorhanden ist, indem Sie Folgendes hinzufügen:
Sie können auch sicherstellen, dass Sie eine Bash-Shell (oder eine verwandte Shell) verwenden, indem Sie 'echo $ SHELL' eingeben. Ich denke, dass CSH und TCSH für diese Schleife eine etwas andere Semantik verwenden.
quelle
while [ ! -f /tmp/list.txt ]; do sleep 2; done; ls -l /tmp/list.txt
Wenn Sie unter Linux arbeiten und inotify-tools installiert haben, können Sie dies tun:
Dies verringert die Verzögerung, die durch den Ruhezustand verursacht wird, während weiterhin alle "x" Sekunden abgefragt wird. Sie können weitere Ereignisse hinzufügen, wenn Sie davon ausgehen, dass sie benötigt werden.
quelle
--exclude
Dateinamen herausfiltern muss , aber nicht--include
alles außer dem Dateinamen ignorieren muss . Der obige Befehl sollte das-qq
Argument anstelle von>&/dev/null
obwohl verwenden.--timeout
, nicht die Häufigkeit der Überprüfung, nein? Der Punkt von inotifywait ist, dass es keine Umfrage gibtinotifywait
es unbegrenzt hängen bleiben, wenn eine Datei erstellt wird, bevor sie auf Ereignisse wartet.Ich hatte das gleiche Problem, setzen Sie die! außerhalb der Klammern;
Wenn Sie ein Echo in die Schleife einfügen, werden Sie darüber informiert, ob Sie in die Schleife einsteigen oder nicht.
quelle
Ich bin auf ein ähnliches Problem gestoßen, das mich hierher geführt hat, und ich wollte meine Lösung nur jedem überlassen, der das Gleiche erlebt.
Ich stellte fest, dass
cat /tmp/list.txt
die Datei leer wäre , wenn ich sie ausführen würde, obwohl ich sicher war, dass Inhalte sofort in die Datei eingefügt wurden. Es stellt sich heraus, wenn ichsleep 1;
kurz vor demcat /tmp/list.txt
es wie erwartet funktioniert hat. Es muss eine Verzögerung zwischen dem Zeitpunkt der Erstellung der Datei und dem Zeitpunkt des Schreibens gegeben haben, oder etwas in dieser Richtung.Mein letzter Code:
Hoffe, das hilft jemandem eine frustrierende halbe Stunde zu sparen!
quelle
Wie bei @ zane-hooper hatte ich ein ähnliches Problem mit NFS. Auf parallelen / verteilten Dateisystemen kann die Verzögerung zwischen dem Erstellen einer Datei auf einem Computer und dem "Sehen" des anderen Computers sehr groß sein, sodass ich nach dem Erstellen der Datei bis zu einer vollen Minute warten kann, bevor die while-Schleife beendet wird (und Es gibt auch einen Nacheffekt davon, dass eine bereits gelöschte Datei "gesehen" wird.
Dies erzeugt die Illusion, dass das Skript "nicht funktioniert" , während es tatsächlich das Dateisystem ist, das den Ball fallen lässt.
Ich habe eine Weile gebraucht, um herauszufinden, ich hoffe, es spart jemandem etwas Zeit.
PS Dies verursacht auch eine ärgerliche Anzahl von "Stale File Handler" -Fehlern.
quelle
funktioniert mit bash und sh beides:
quelle
Hier ist eine Version mit einer Zeitüberschreitung, sodass die Schleife nach einiger Zeit mit einem Fehler endet:
quelle
mach es so
quelle