Я тестировал CygWin, выполняя «ls -R» с большим каталогом и отправляя вывод в файл Test.txt, поэтому процесс занимает около 30 секунд; файл создан, но он пуст ; она будет заполнена только тогда , когда «LS -R» команда завершается, и мне нужно , чтобы увидеть содержимое файла тем временем новые данные ввода.
Предполагается, что проблема связана с буферизацией, которую операционная система делает перед записью в файл.
Вот что я протестировал, чтобы записать в файл без буферизации:
- Команда unbuffer из
expectпакета: где она? Современнаяexpectверсия не имеет такой командыunbuffer(см. Ниже):
./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
- Устанавливая пакет Expect и называя "unbuffer" этот скрипт:
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
eval spawn -noecho $argv
set timeout -1
expect
- Устанавливая пакет Expect и называя "unbuffer" этот другой скрипт:
#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST
if {[string compare [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
interact {
eof {
# flush remaining output from child
expect -timeout 1 -re .+
return
}
}
} else {
set stty_init "-opost"
set timeout -1
eval spawn -noecho $argv
expect
}
- Сценарий команды:
script -c "ls /cygdrive/y/Repositorio/ -R" | tee Test.txt
script -c "ls /cygdrive/y/Repositorio/ -R" /dev/null | tee Test.txt
script -q -c "ls /cygdrive/y/Repositorio/ -R" /dev/null | tee Test.txt
script -q -c "ls /cygdrive/y/Repositorio/ -R" /dev/null | grep "" --line-buffered | tee Test.txt
script -q -c "ls /cygdrive/y/Repositorio/ -R" /dev/null | egrep "" --line-buffered | tee Test.txt
- Команда egrep с опцией отмены буферизации:
cat BigFile.txt | egrep "" --line-buffered | tee Test.txt
Stdbuf: он не существует на современном CygWin, или я так думаю.
Другие методы:
ls /cygdrive/y/Repositorio/ -R 1>&2 | tee Test.txt
ls /cygdrive/y/Repositorio/ -R 1>&2 |& tee Test.txt
Тесты сделаны с
bashиmintty.Проверено и проверено все в этих темах:
Запись вывода "tail -f" в другой файл
https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe
https://serverfault.com/questions/294218/is-there-a-way-to-redirect-output-to-a-file-without-buffering-on-unix-linux
Результаты всегда одинаковы: выходной файл Test.txt заполняется только в конце команды «ls -R».
Есть еще идеи, пожалуйста?
