3

ここで知りたいことは本当に「基本」のはずですが、それは長い間頭に浮かんだ疑問であり、トリックがどこにあるのかわかりません。

bash時間のかかるプログラム (またはPython) で、実行中に進行状況のパーセンテージを出力する必要が1%あるとしましょう2%。「1% 2%」などではなく、表示さ'2%'れたのとまったく同じ位置に表示されます。'1%'ご存知wgetのように、私が欲しいのは、ダウンロードの進行状況を表示するために、まさに wget が行うことです。以前に印刷された文字をクリアする必要がありますか?

基本的にはどのように機能しますか...

ありがとう、

4

4 に答える 4

6

簡単なので、Pythonで答えます。

ターミナルにバックスペースを印刷してカーソルを左に移動してから、別の文字を書き込んで現在の位置を上書きすることができます。キャリッジリターンを使用して、行の先頭に移動することもできます。

import time
import sys
for x in range(101):
    sys.stdout.write('\r%d%%' % x)
    sys.stdout.flush()
    time.sleep(0.2)
sys.stdout.write('\n')

印刷するバックスペースの数に注意する必要がないため、キャリッジリターンを使用して行全体を書き換えるのが最も簡単です。

新しい行が古い行より短い場合でも、古い行は透けて見えることに注意してください。

import sys
sys.stdout.write('this is a very long line')
sys.stdout.write('\rshort line')
sys.stdout.write('\n')

出力:

短い線非常に長い線

典型的な解決策は、長い行にスペースを書き込むことです。

于 2012-06-22T04:02:34.300 に答える
1

Python ソリューションが提供されています。bash では特に難しい (または異なる) ものではありません。

i=20
while (( i-- ))
do
    echo -ne "\r$i% done  "
    sleep 1
done

echo

とにかくによって呼び出されるflushため、bashでは必要ありませechoん。への引数はecho-n改行を抑制し、表記を-e変換します。\r行末までクリアするために、文字列内のテキストの最後にいくつかのスペースがあるハックに注意してください。

于 2012-06-22T07:50:23.813 に答える
1

これは単純なタイマーです ;-) print 関数で現在の位置を上書きする別の文字を書きます。

from __future__ import print_function
def timer():
 for h in range(0, 24):
  for m in range(0, 60):
   for s in range(0, 60):
    time.sleep(1)
    print ("Elapsed time : %s:%s:%s" % (h, m, s), end="\r")
于 2014-06-06T16:23:00.007 に答える