openocd
私はゴミをたくさん印刷するツール()を使用していますが、デフォルトの進行状況バーはゆっくりと簡単な点を印刷してから、いくつかのゴミを印刷します。
grep
進行状況バーがある行だけがリアルタイムで表示されるように(つまり、各出力ポイントが端末openocd
にすぐに印刷されるように)、この出力をフィルタリングしたいと思います。
openocd <args> |& grep '^\.'
問題はgrep
(せいぜい)ラインバッファリングなので、完了するまで進行状況バーが表示されないことです。
この問題をどのように解決するのですか?grep
それともこれを達成するための標準的な選択肢はありますか?openocd
私はより一般的な解決策を好みますが、設定を介して方法がある場合は便利です。
ベストアンサー1
これはハッキーで珍しい答えです。実際、これはあまりきれいではない方法で実装されている可能性が高いです。
grep
これは改行文字が表示されたときにのみ出力を印刷するように見えます。更新時に進行状況バーに改行文字が表示されない可能性があるため、問題が発生します。
strace
コマンドが呼び出すシステムコールを表示するためのツールです。これには、メモリ/ストレージへの読み書き、ファイルディスクリプタの開閉などの操作が含まれます。
パイプが渡されると、strace
プロセスがアクセスする内容が表示され、テキストが提供されていることがわかります。パイプされたコマンドの出力は定期的に送信され、その出力をスニッフィングして表示できます。テスト中ですが、同様の状況が発生しているようです。進捗状況を示すために使用しました。stout
grep
strace
grep
strace
rsync --progress
grep
##%
rsync
rsync --progress file1 file2 | strace -e trace=read grep "[0-9]*%"
このコマンドを実行するとstrace
出力が良くないことがわかりますが、このコマンドを使用すると、一般的に表示されないstrace
一部のsをキャプチャして、sを0%、21%、45%、68%と表示します。read
91%と100%は毎秒更新されるようです(おそらく進行状況が更新される頻度によって異なります)。rsync
grep
write
read
rsync
したがって、同じ出力を再度呼び出すと、あまり良い出力が得られませんgrep
。strace
grep
rsync --progress file1 file2 | strace -e trace=read grep "[0-9]*%" 2>&1 > /dev/null | grep -o "[0-9]*%"
最初の出力が報告されないように.redirectsとして印刷する2>&1
ため、これは重要です。最終結果は次のとおりです。strace
stderr
> /dev/null
stdout
/dev/null
grep
0%
21%
45%
68%
91%
100%
交換する必要がありますgrep
が効果があるようです。きれいではありませんが、動作してバイパスすることができます。このようなものが便利なgrep
ようです(すでに使用されていることを知っています)。grep -f
tail -f
grep -f
1つ目は、主にgrep
実行されるテキストをフィルタリングすることですstrace
。read
なぜなら、一致する行だけが呼び出しにリストされているからですstrace
。ただし、テキストを表示できるread
ように移動するには何かが必要です。strace