関数コマンドの実行に伴う進捗状況を示すプログレスバー「ダイアログボックス」

関数コマンドの実行に伴う進捗状況を示すプログレスバー「ダイアログボックス」

各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

関連情報