クールなpvが出力行のサブセットを計算する2番目のpvにパイプされるLinuxボックスにスクリプトがあります。
スクリプトは次のとおりです。
max=1000
for (( i=0; i<max; i++ )); do
[[ $(shuf -i 1-100 -n 1) -lt 20 ]] && echo REMOVE || echo LEAVE
done | pv -F "%N %b / $(numfmt --to=si $max) %t %p %e" -c -N 'Lookups' -l -s $max \
| grep --line-buffered '^REMOVE' \
| pv -F "%N %b / $(numfmt --to=si $max)" -c -N 'Deletes' -l -s $max \
>/dev/null
stty sane
私が期待するのは、最初のPVが常に最初に表示され、2番目のPVが常に2番目に表示されることです。
この例の出力と同じです。
$ ./fancy_pv.sh
Lookups: 1.00k / 1.0K 0:00:03 [===============================================================================================================================================================================================================================================================================================================================================================>] 100%
Deletes: 189 / 1.0K
しかし、そうではありません。時々彼らは場所を変えて、次のようなものを見ます。
$ ./fancy_pv.sh
Deletes: 199 / 1.0K
Lookups: 1.00k / 1.0K 0:00:03 [===============================================================================================================================================================================================================================================================================================================================================================>] 100%
時々、次のような内容も見ることができます。
$ ./fancy_pv.sh
Lookups: 321 / 1.0K 0:00:01 [===============================================================================================================> ] 32% ETA 0:00:02
Deletes: 198 / 1.0K
Lookups: 1.00k / 1.0K 0:00:03 [===============================================================================================================================================================================================================================================================================================================================================================>] 100%
私はこれがpvが行を削除して再描画する方法によるものであることを知っていますが、順序をめちゃくちゃにするのを防ぐために私ができることはありますか?
stty sane
時々pvのために端末が利用できなくなるので、プロンプトをクリーンアップできますか?
ありがとう
ベストアンサー1
pv
パイプラインの2つのプロセスは、任意の順序で開始できます。最新の出力はpv
一番下の行に表示されます。
pv
希望の最終結果を延期してください。サブシェルを使用する代わりにpv …
(すべての引数が表示されます):…
( </dev/null sleep 1; exec pv … )
理論的には、他のものはpv
遅延された後に開始し続けることができますが、完全に過負荷ではないシステムでは、遅延がほぼ確実にpv
最後に開始されます。
sleep
</dev/null
とにかく奇妙な場合に備えて、標準入力から読んではいけませんsleep
。
いくつかの競合状態が原因で追加(不良)行が表示されるかどうかはわかりません。もしそうならpv
、(ほぼ確実に)遅らせることが役に立ちます。私のテストで端末に「追加」アップデートが必要な場合、出力は破損しています。だから:
pv
実行中は端末のサイズを変更しないでください。- スクロールを避ける:
- スクリプトを実行する前に呼び出し
clear
(またはCtrl+を押すL)してください。これにより、画面が消去され、先端が一番上に配置され、後でスクロールすることなく下にスペースが提供されます。 pv
sの実行中は入力しないでください。特に複数のEntersを使用しないでください(テキストスクロールが発生する可能性があります)。- 通常、sが完了するまで
pv
s以外の内容が端末に印刷されないようにしてくださいpv
。これは、パイプラインの他の部分(例:を介して/dev/tty
)、スクリプト内の非同期プロセス(例:stdoutを介してのみ)、スクリプトの外部プロセス(たとえば、または経由)/dev/tty*
で/dev/pts/*
機能します。
- スクリプトを実行する前に呼び出し