Shell-Pufferung für CygWin: Ist das möglich?

1059
Sopalajo de Arrierez

Ich habe getestet, wie CygWin "ls -R" mit einem großen Verzeichnis ausführt und die Ausgabe an eine Test.txtDatei sendet. Der Vorgang dauert also etwa 30 Sekunden. Die Datei wird erstellt, ist aber leer . es wird nur gefüllt werden, wenn die „ls -R“ Befehl beendet, und ich brauche der Dateiinhalt mittlerweile neue Daten sehen eintreten.

Das Problem soll von der Pufferung stammen, die das Betriebssystem vor dem Schreiben in die Datei vornimmt.

Das habe ich getestet, um ohne Pufferung in die Datei zu schreiben:

  • Der Unbuffer- Befehl aus dem expectPaket: Wo ist es? Moderne expectVersion hat keinen solchen unbufferBefehl (siehe unten):
 ./unbuffer -p ls / cygdrive / y / Repositorio / -R> Test.txt ./unbuffer ls / cygdrive / y / Repositorio / -R | tee Test.txt ./unbuffer -p ls / cygdrive / y / Repositorio / -R | tee Test.txt ./unbuffer ls / cygdrive / y / Repositorio / -R | ./unbuffer -p egrep "" | tee Test.txt ./unbuffer -p ls / cygdrive / y / Repositorio / -R | ./unbuffer -p egrep "" | tee Test.txt 
  • Installieren Sie das Expect- Paket und benennen Sie dieses Skript mit "unbuffer":
 #! / usr / bin / expect - # Beschreibung: Unbuffer stdout eines Programms # Autor: Don Libes, NIST eval spawn -noecho $ argv Timeout -1 einstellen erwarten von 
  • Installieren Sie das Expect- Paket und benennen Sie dieses andere Skript mit "unbuffer":
 #! / usr / bin / expect - # Beschreibung: Unbuffer stdout eines Programms # Autor: Don Libes, NIST if {[string vergleich [lindex $ argv 0] "-p"] == 0} { # Pipeline set stty_init "-echo" eval spawn -noecho [lrange $ argv 1 end] close_on_eof -i $ user_spawn_id 0 interagieren eof { # Flush verbleibende Ausgabe von Kind Erwarten Sie -timeout 1 -re. + Rückkehr } } } else { setze stty_init "-opost" Timeout -1 einstellen eval spawn -noecho $ argv erwarten von } 
  • Der Skriptbefehl :
 Skript -c "ls / cygdrive / y / Repositorio / -R" | tee Test.txt Skript -c "ls / cygdrive / y / Repositorio / -R" / dev / null | tee Test.txt Skript -q -c "ls / cygdrive / y / Repositorio / -R" / dev / null | tee Test.txt Skript -q -c "ls / cygdrive / y / Repositorio / -R" / dev / null | grep "" --line-gepuffert | tee Test.txt Skript -q -c "ls / cygdrive / y / Repositorio / -R" / dev / null | egrep "" --line-gepuffert | tee Test.txt 
  • Der Befehl egrep mit Unpufferung:
 cat BigFile.txt | egrep "" --line-gepuffert | tee Test.txt 
  • Das stdbuf : Es gibt es nicht auf dem modernen CygWin, glaube ich.

  • Andere Methoden:

 ls / cygdrive / y / Repositorio / -R 1> & 2 | tee Test.txt ls / cygdrive / y / Repositorio / -R 1> & 2 | & tee Test.txt 

Die Ergebnisse sind immer gleich: Die Ausgabedatei Test.txtwird nur am Ende des Befehls "ls -R" gefüllt.

Weitere Ideen bitte?

4
Ich bin nicht sicher, ob dies ausschließlich auf die Pufferung zurückzuführen ist. Puffer sind heutzutage normalerweise 64 kb und 30 Sekunden sind eine lange Zeit. Ich würde erwarten, dass "ls" 64 kb schneller füllt. Wenn dies immer noch ein Problem für Sie ist, können Sie uns die Größe des resultierenden `Test.txt 'mitteilen? André Chalella vor 8 Jahren 1

0 Antworten auf die Frage