CygWin 的 Shell 解除缓冲:可能吗?

CygWin 的 Shell 解除缓冲:可能吗?

我已经在 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

结果总是相同的:输出文件Test.txt仅在“ls -R”命令末尾填充。

请问还有其他想法吗?

答案1

使用 stdbuf。它位于 coreutils 包中的 cygwin 中。

相关内容