5

スクリプト内に、それを呼び出したタスクが完了するまで「お待ちください」メッセージをループする進行状況インジケーター関数を記述したいと考えています。

他のスクリプトで再利用できるように、関数にしたいです。

これを実現するには、関数を他の関数と疎結合にする必要があります。つまり、それを呼び出す関数はその内部コードを知る必要はありません。

これが私がこれまでに持っているものです。この関数は呼び出し元の pid を受け取り、タスクが終了するまでループします。

function progress() {
  pid="$1"

  kill -n 0 "${pid}" &> /dev/null && echo -ne "please wait"
  while kill -n 0 "${pid}" &> /dev/null ; do
    echo -n "."
    sleep 1
  done
}

次のようなスクリプトで使用すると、正常に機能します。

#imports the shell script with the progress() function
. /path/to/progress.sh

echo "testing"
# $$ returns the pid of the script.
progress $$ &
sleep 5
echo "done"

出力:

$ testing
$ please wait.....
$ done

問題は、関数にpidがないため、別の関数から呼び出すときです。

function my_func() {
  progress $$ &
  echo "my func is done"
}

. /path/to/progress.sh
echo "testing"
my_func
sleep 10
echo done

出力:

$ testing
$ please wait.....
$ my func. is done.
$ ..........
$ done
4

4 に答える 4

2

dialog- bash curses 指向のメニュー システムに興味があるかもしれません。

プログレス バーについては、http://bash.cyberciti.biz/guide/A_progress_bar_( gauge_box)で確認できます。

または、別のより単純なプロジェクト: http://www.theiling.de/projects/bar.html

興味がない場合は、次を試すことができます。

dotpid=
rundots() { ( trap 'exit 0' SIGUSR1; while : ; do echo -n '.' >&2; sleep 0.2; done) &  dotpid=$!; }
stopdots() { kill -USR1 $dotpid; wait $dotpid; trap EXIT; }
startdots() { rundots; trap "stopdots" EXIT; return 0; }

longproc() {
    echo 'Start doing something long... (5 sec sleep)'
    sleep 5
    echo
    echo 'Finished the long job'
}

run() {
    startdots
    longproc
    stopdots
}

#main
echo start
run
echo doing someting other
sleep 2
echo end of prog
于 2013-06-04T20:35:57.280 に答える
1

バックグラウンドで実行すると、残りのコードと混合された出力が得られるため、progress実行中に他の場所に何も出力しないでください。

関数として実装するには、進行状況がいつ終了するかを制御するためのグローバル変数が必要です (progress呼び出し時に変数の名前を arg として渡すことができます)。

于 2013-06-04T20:05:51.450 に答える
1

このプロジェクトについて聞いたことがあります。私はそれを使用していないので、統合がどれほど簡単かはわかりませんが、読むことができます.

于 2013-06-04T20:06:25.020 に答える
0

悲しいことに、シェルスクリプトを使用してやりたいことができませんでした。これが私がやったことです:

function progress() {
  echo -ne "please wait"
  while :
  do
    echo -n '.'
    sleep 1
  done
}

利用方法:

aguarde &
dotpid=$!
# code
eval "kill ${dotpid}"
于 2013-06-28T17:56:12.733 に答える