Небуферинг оболочки для CygWin: возможно ли это?

970
Sopalajo de Arrierez

Я протестировал на 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 | Test.txt ./unbuffer -p ls / cygdrive / y / Repositorio / -R | Test.txt ./unbuffer ls / cygdrive / y / Repositorio / -R | ./unbuffer -p egrep "" | Test.txt ./unbuffer -p ls / cygdrive / y / Repositorio / -R | ./unbuffer -p egrep "" | Test.txt 
  • Устанавливая пакет Expect и называя «unbuffer» этот скрипт:
 #! / usr / bin / Ожидается - # Описание: снятие буфера с выхода программы # Автор: Дон Либес, NIST eval spawn -noecho $ argv установить время ожидания -1 ожидать 
  • Устанавливая пакет Expect и называя «unbuffer» этот другой скрипт:
 #! / usr / bin / Ожидается - # Описание: снятие буфера с выхода программы # Автор: Дон Либес, NIST if {[string сравни [lindex $ argv 0] "-p"] == 0} { # трубопровод установить stty_init "-echo" eval spawn -noecho [lrange $ argv 1 end] close_on_eof -i $ user_spawn_id 0 взаимодействовать { eof { # сбросить оставшийся вывод от дочернего ожидаемый тайм-аут 1-ре. + вернуть } } } еще { set stty_init "-opost" установить время ожидания -1 eval spawn -noecho $ argv ожидать } 
  • Скрипт команды:
 скрипт -c "ls / cygdrive / y / Repositorio / -R" | Test.txt скрипт -c "ls / cygdrive / y / Repositorio / -R" / dev / null | Test.txt скрипт -q -c "ls / cygdrive / y / Repositorio / -R" / dev / null | Test.txt скрипт -q -c "ls / cygdrive / y / Repositorio / -R" / dev / null | grep "" - line-buffered | Test.txt скрипт -q -c "ls / cygdrive / y / Repositorio / -R" / dev / null | egrep "" - line-buffered | Test.txt 
  • Команда egrep с опцией отмены буферизации:
 кошка BigFile.txt | egrep "" - line-buffered | Test.txt 
  • Stdbuf : она не существует на современном CygWin, или я так думаю.

  • Другие методы:

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

Результаты всегда одинаковы: выходной файл Test.txtзаполняется только в конце команды "ls -R".

Есть еще идеи, пожалуйста?

4
Я не уверен, что это исключительно из-за буферизации. Буферы в настоящее время обычно составляют 64 кбайт, а 30 секунд - это длительное время; Я ожидаю, что `ls` заполнит 64 КБ быстрее, чем это. Если это все еще проблема для вас, не могли бы вы сообщить нам размер результирующего `Test.txt`? André Chalella 8 лет назад 1

0 ответов на вопрос

Похожие вопросы