我已经在 CygWin 上测试过使用“ls -R”大型目录并发送输出到Test.txt
文件,因此该过程大约需要 30 秒才能完成;文件已创建,但空的;只有当“ls -R”命令时才会填充完成,并且我需要在新数据输入的同时查看文件内容。
问题应该来自缓冲这是操作系统在写入文件之前所做的操作。
这是我为了不缓冲而写入文件所进行的测试:
- 这解除缓冲来自包的命令
expect
:它在哪里?现代expect
版本没有这样的unbuffer
命令(见下文):
./unbuffer -p ls /cygdrive/y/Repositorio/ -R > 测试.txt ./unbuffer ls /cygdrive/y/Repositorio/-R | tee Test.txt ./unbuffer -p ls /cygdrive/y/Repositorio/ -R | tee 测试.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
- 安装预计打包并命名该脚本为“unbuffer”:
/usr/bin/期望-- # 描述:取消程序的标准输出缓冲 # 作者:Don Libes,NIST eval spawn-noecho $argv 设置超时-1 预计
- 安装预计打包并将另一个脚本命名为“unbuffer”:
/usr/bin/期望-- # 描述:取消程序的标准输出缓冲 # 作者:Don Libes,NIST 如果 {[字符串比较 [lindex $argv 0] "-p"] == 0} { # 管道 设置 stty_init“-echo” eval spawn-noecho [lrange $argv 1 end] close_on_eof -i $user_spawn_id 0 相互影响 { 结束语 { # 刷新子级剩余的输出 预期-超时 1-re .+ 返回 } } } 别的 { 设置 stty_init“-opost” 设置超时-1 eval spawn-noecho $argv 预计 }
- 这脚本命令:
脚本-c“ ls / cygdrive / y / Repositorio / -R” | tee Test.txt 脚本-c“ ls / cygdrive / y / Repositorio / -R” / dev / null | tee Test.txt 脚本-q-c“ ls / cygdrive / y / Repositorio / -R” / dev / null | tee Test.txt 脚本-q-c“ ls / cygdrive / y / Repositorio / -R” / dev / null | grep“”--line-buffered | tee Test.txt 脚本-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
这标准缓冲区:它不存在于现代 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”命令末尾填充。
请问还有其他想法吗?
答案1
使用 stdbuf。它位于 coreutils 包中的 cygwin 中。