スクリプト内に進捗インジケータ関数を記述して、呼び出されたタスクが完了するまで「しばらくお待ちください」というメッセージをループします。シェルスクリプトに進捗インジケータ機能を表示するにはどうすればよいですか?
私はそれを他のスクリプトで再利用できるように関数にしたいです。
これを達成するには、関数を他の関数と疎結合する必要があります。つまり、呼び出す関数が内部コードを知る必要はありません。
これまで私がこれまで持っていたことは次のとおりです。この関数は、呼び出し元の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
これは私の以前の試みに近いですが、私はprogress()関数の外でそれを削除することを避けようとしていました...しかし、おそらくシェルスクリプトではできません。ありがとう! – Tarek
こんにちは、提供されたコードを試しましたが、プログラムが完了したときにSIGTERMが送信されるため、同じ問題が発生します。 killシグナルを明示的に送信しない限り、関数内で使用することはできません。 – Tarek
@Tarekは、 "関数内"と "killを送信しない限り"とはどういう意味なのですか?:しかし、関数内での使用方法を示すスクリプトを編集しました。 __need__はシグナルを送ります - あなたはバックグラウンドプロセスに何かを伝える必要があります: "今停止" ...。あなたが他の何かを意味するなら - 助けてはいけない... – jm666