我想在我的脚本中编写一个进度指示器函数,它会循环“请等待”消息,直到调用它的任务完成。
我希望它是一个函数,以便我可以在其他脚本中重用它。
为了实现这一点,函数需要与其他函数松散耦合,即调用它的函数不必知道它的内码。
这是我到目前为止所拥有的。此函数接收调用者的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
问题是当我从另一个函数调用它时,因为函数没有pids:
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
答案 0 :(得分: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
答案 1 :(得分:1)
通过在后台运行它会使其输出与其余代码混合,因此在progress
运行时,您不能在其他地方输出任何内容。
要将其实现为函数,您需要一个全局变量来控制进度何时终止(您可以在调用时将变量名称作为arg传递给progress
。)
答案 2 :(得分:1)
我听说过project。我没有使用它所以不确定集成是多么容易,但是你可以给它一个阅读。
答案 3 :(得分:0)
可悲的是,我无法使用shell脚本做我想做的事情。这就是我所做的:
function progress() {
echo -ne "please wait"
while :
do
echo -n '.'
sleep 1
done
}
用法:
aguarde &
dotpid=$!
# code
eval "kill ${dotpid}"