CygWin 的 Shell 无缓冲:有可能吗?

Sop*_*rez 9 cygwin shell buffer

我已经在 CygWin 上测试过使用大目录执行“ls -R”并将输出Test.txt发送文件,因此该过程大约需要 30 秒才能完成;文件已创建,但为;它只会在“ls -R”命令完成时填充,我需要在输入新数据的同时查看文件内容。

问题应该来自操作系统在写入文件之前进行的缓冲

这是我为了在没有缓冲的情况下写入文件而进行的测试:

  • 包中的unbuffer命令expect:它在哪里?现代expect版本没有这样的unbuffer命令(见下文):
    ./unbuffer -pls /cygdrive/y/Repositorio/ -R > Test.txt
    ./unbuffer ls /cygdrive/y/Repositorio/ -R | 三通测试.txt
    ./unbuffer -pls /cygdrive/y/Repositorio/ -R | 三通测试.txt
    ./unbuffer ls /cygdrive/y/Repositorio/ -R | ./unbuffer -p egrep "" | 三通测试.txt
    ./unbuffer -pls /cygdrive/y/Repositorio/ -R | ./unbuffer -p egrep "" | 三通测试.txt
  • 安装Expect包并命名“unbuffer”这个脚本:
    #!/usr/bin/expect --
    # 描述: unbuffer 程序的标准输出
    # 作者:Don Libes,NIST
    eval spawn -noecho $argv
    设置超时-1
    预计
  • 安装Expect包并将其他脚本命名为“unbuffer”:
    #!/usr/bin/expect --
    # 描述: unbuffer 程序的标准输出
    # 作者:Don Libes,NIST
    if {[string compare [lindex $argv 0] "-p"] == 0} {
        # 管道
        设置 stty_init "-echo"
        eval spawn -noecho [lrange $argv 1 end]
        close_on_eof -i $user_spawn_id 0
        相互影响 {
        eof{
            # 刷新子进程的剩余输出
            期望 -timeout 1 -re .+
            返回
        }
        }
    } 别的 {
        设置 stty_init "-opost"
        设置超时-1
        eval spawn -noecho $argv
        预计
    }
  • 脚本命令:
    脚本 -c "ls /cygdrive/y/Repositorio/ -R" | 三通测试.txt
    script -c "ls /cygdrive/y/Repositorio/ -R" /dev/null | 三通测试.txt
    script -q -c "ls /cygdrive/y/Repositorio/ -R" /dev/null | 三通测试.txt
    script -q -c "ls /cygdrive/y/Repositorio/ -R" /dev/null | grep "" --line-buffered | 三通测试.txt
    script -q -c "ls /cygdrive/y/Repositorio/ -R" /dev/null | egrep "" --line-buffered | 三通测试.txt
  • 带有 unbuffering 选项的egrep命令:
    cat BigFile.txt | egrep "" --line-buffered | 三通测试.txt
  • stdbuf:它不能在现代CygWin的存在,还是让我觉得。

  • 另一种方法:

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

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

请有更多想法吗?

Ast*_*ara 0

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