スクリプト内に、それを呼び出したタスクが完了するまで「お待ちください」メッセージをループする進行状況インジケーター関数を記述したいと考えています。
他のスクリプトで再利用できるように、関数にしたいです。
これを実現するには、関数を他の関数と疎結合にする必要があります。つまり、それを呼び出す関数はその内部コードを知る必要はありません。
これが私がこれまでに持っているものです。この関数は呼び出し元の 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