web-dev-qa-db-ja.com

待機時間を視覚化するbashのプログレスバー

Bashスクリプトでは、バックグラウンドプロセスが完了するまで数秒待つ必要がある場合があります。

私は通常例えば使用します:

sleep 10

スクリプトに一種のプログレスバーを追加して、ユーザーが待機する時間を知るにはどうすればよいですか?

コマンドbarをインストールしましたが、マニュアルがわかりません。

7
rubo77
while true;do echo -n .;sleep 1;done &
sleep 10 # or do something else here
kill $!; trap 'kill $!' SIGTERM
echo done

これにより、スピナーを毎秒エコーする無限のwhileループが開始され、バックグラウンドで実行されます。

sleep10コマンドの代わりに、必要なコマンドを実行します。

そのコマンドの実行が完了すると、これはバックグラウンドで実行されている最後のジョブを強制終了します(これは無限のwhileループです)

ソース: https://stackoverflow.com/a/16348366/106908

代わりに、さまざまなwhileループを使用できます。このようなスピナー:

while :;do for s in / - \\ \|; do printf "\r$s";sleep 1;done;done
14
rubo77

これはあなたを始めるのに十分なはずです:

#!/bin/bash

for i in {001..100}; do
    sleep 1
    printf "\r $i"

done

\rエスケープシーケンスを使用すると、改行なしで行が最初に戻ります。これにより、何百行もの出力がなくても出力を更新できます。このベースを使用することにより、単に数字を出力する代わりに、=>25% ==>50% ===>75%などの矢印をゆっくりと出力する方法を見つけることができます。非常に基本的な方法でこれを行うには、if-thenロジックを使用して、数のサイズに応じて特定の数の=を出力します。

6
bntser

cursor Movements を使用して、カウントダウンを表示するために行を書き換えます。

c=5 # seconds to wait
REWRITE="\e[25D\e[1A\e[K"
echo "Starting..."
while [ $c -gt 0 ]; do 
    c=$((c-1))
    sleep 1
    echo -e "${REWRITE}$c"
done
echo -e "${REWRITE}Done."
1
Supr