打印后台函数的输出后,如何自动返回到我的 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以获取提示的“外观”......而且我无法打开另一个“窗口” - 他们没有显示服务器。