CygWinのシェルバッファリング解除:可能ですか?


5

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-
    #説明:プログラムの標準出力をアンバッファー
    #著者:Don Libes、NIST
    eval spawn -noecho $ argv
    タイムアウト-1を設定
    期待する
  • Expectパッケージをインストールし、この他のスクリプトに「unbuffer」という名前を付けます。
    #!/ usr / bin / expect-
    #説明:プログラムの標準出力をアンバッファー
    #著者: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 {
            #残りの出力を子からフラッシュ
            expect -timeout 1 -re。+
            帰る
        }
        }
    } else {
        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
  • stdbuf:それは現代の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
これがバッファリングのみによるものかどうかはわかりません。現在のバッファは通常64 kbであり、30秒は長い時間です。私lsはそれよりも速く64 kbを埋めることを期待しています。それでも問題が解決しない場合は、結果のサイズを教えてくださいTest.txt
アンドレチャレラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.