各echoコマンドが関数で実行されたときに「ダイアログボックス」の進行状況バーがカウンタをインクリメントするようにするにはどうすればよいですか?
例として以下のコードがあり、関数コマンドの実行時にキャプチャに問題が発生します。関数で「エコー」の数を数えて「アイテム」に設定することはできますが、エコーがいつ終わるのかをどのように知り、バーをどのように増やすことができますか?
#!/bin/bash
function two() {
echo "test2-1"; sleep 1;
echo "test2-2"; sleep 1;
echo "test2-3"; sleep 1;
echo "test2-4"; sleep 1;
echo "test2-5"; sleep 1;
}
(
items=5
processed=0
while [ $processed -le $items ]; do
pct=$(( $processed * 100 / $items ))
echo "XXX"
echo "Processing item $processed" # Here I wish instead $processed
# to be value (test2-1, test2-2 etc.)
# of processed echo
echo "XXX"
echo "$pct"
processed=$((processed+1))
sleep 3 # Instead of this it should be when echo is finished printing
done
) | dialog --title "Gauge" --gauge "Wait please..." 10 60 0
答え1
一般的な構文は次のとおりです。dialog --gauge
このデモスクリプトは、ダイアログボックスに進捗状況を表示する方法を示しています。
#!/bin/bash
( echo 10;sleep 1;echo 50;sleep 1; echo 90;sleep 1;echo 100;sleep 1 ) | dialog --gauge 'text' 10 60 0
echo '##########'
i=0; while [ $i -le 100 ];do echo "$i";echo "#comment $i";i=$((i+10));sleep 1;done
echo '##########'
i=0; while [ $i -le 100 ];do echo "$i";echo "#comment $i";i=$((i+10));sleep 1;done| dialog --gauge 'text' 10 60 0
- 数字0〜100の出力を使用してください。
- 他の出力には#プレフィックスが付いてコメントとして扱われるため、混乱はありません
dialog
。 #プレフィックスなしで数字以外の文字(テキスト行)も処理できますが、予期しないことが発生する可能性があります。
他の出力がある場合は、それをキャプチャして処理した後、関連する値のみを0〜100にパイプする必要がありますdialog
。
編集:既知の出力ライン数
次のスクリプトでは、次のことを前提としています。既知の出力ライン数(この場合5)完了するまでこの機能を使用してactor
供給しますdialog
。
#!/bin/bash
expected_outputs=5
ii=0
function two() {
echo "test2-1"; sleep 1;
echo "test2-2"; sleep 1;
echo "test2-3"; sleep 1;
echo "test2-4"; sleep 1;
echo "test2-5"; sleep 1;
}
function actor () {
while read ans
do
echo "# $ans"
ii=$((ii+1))
echo $((ii*100/expected_outputs))
done
}
# main
two | actor
two | actor | dialog --title "Gauge" --gauge "Wait please..." 10 60 0
編集2:zenity --progress
グラフィックスデスクトップ環境では、次のようなコマンドラインを使用できますzenity
。
two | actor | zenity --progress --title "Gauge" --text="string" --percentage=0 --auto-close --width=300