打印后台函数的输出后,如何自动返回到我的 bash 提示符?
例如,当我在 bash shell 中运行以下脚本时:
fn(){
睡觉 10
回声“完成”
出口
}
fn&
运行脚本后,它立即返回我的提示。10 秒后,它会打印“完成”,然后在新行上显示一个闪烁的光标:
$ 完成 ▏
该脚本不再运行,但在我按下 之前我不会收到提示Return。
打印“完成”后有什么方法可以强制返回到 bash 提示符?
一个相关的问题是:有没有办法让后台任务通知终端打印新的提示?但是,该问题询问的是后台程序。那里提供的答案适用于发送到后台的程序,但似乎不适用于发送到后台的函数(如我提供的示例中所示)。
澄清一下:我希望保存上面的整个代码片段(例如 as myscript.sh),然后将其作为前台脚本运行(例如 as bash myscript.sh)。
编辑:以上当然只是一个 MWE。这个问题的上下文是:
- 用户运行脚本
- 脚本提交 PBS 作业,开始在后台拖尾输出文件,并调用
fn & - 用户得到提示,可能会开始做其他事情。
- 作业开始运行时,作业输出出现在用户终端上
fn监视队列并tail在作业完成时终止。- 用户抱怨Enter在此完成后没有得到提示(即,必须按 )。
这里有一些更简洁的代码:
watch_queue(){
直到 [`qstat | grep $工作 | wc -l` -lt 1 ]; 做
睡觉 2
完毕
杀死 -9 $pid
tput setaf 7
tput setab 0
echo "按回车键返回命令提示符。"
tput sgr0
出口 0
}
cmd="运行时构建的复杂的东西"
outfile="同上"
queue="在运行时也被选中"
作业=`echo "cd \$PBS_O_WORKDIR && $cmd >> $outfile" |
qsub -q $queue -e /dev/null -o /dev/null |
awk '开始 { FS="." } { 打印 $1 }'`
echo "在 $queue 上排队的作业 $job: $cmd"
eval "tail -f -F $outfile 2>/dev/null &"
pid=$!
watch_queue &
当然,如果我的用户可以从单独的文件中获取作业输出,或者自己在前台和后台之间操作作业,那对我来说会容易得多,但他们不能。他们甚至无法按照脚本中的说明点击Enter以获取提示的“外观”......而且我无法打开另一个“窗口” - 他们没有显示服务器。