如何在打印后台函数的输出后自动返回到我的 bash 提示符?
例如,当我在 bash shell 中运行以下脚本时:
fn(){ sleep 10 echo "Done" exit } fn &
运行脚本后,它立即返回我的提示。 10 秒后,它打印“完成”,然后在新行上显示一个闪烁的光标:
$ Done ▏
脚本不再运行,但在我按 Return 之前我没有收到提示。
有没有办法在打印“完成”后强制返回到 bash 提示符?
一个相关的问题是:Is there a way for a backgrounded task to inform the terminal to print a new prompt?但是,该问题询问的是后台程序。此处提供的答案适用于发送到后台的程序,但似乎不适用于发送到后台的函数(如示例中所示)我提供了)。
澄清一下:我希望保存上面的整个代码片段(例如,作为 myscript.sh
),然后将其作为前台脚本运行(例如,作为 bash myscript.sh
)。
编辑:以上当然只是一个 MWE。这个问题的上下文是:
- 用户运行脚本
- 脚本提交 PBS 作业,开始在后台跟踪输出文件,并调用
fn &
- 用户得到提示,可能会开始做其他事情。
- 当作业开始运行时,作业输出出现在用户的终端上
fn
监控队列并在作业完成时杀死tail
。- 用户提示完成后没有得到提示(即必须按 Enter)。
下面是一些不太简单的代码:
watch_queue(){ until [ `qstat | grep $job | wc -l` -lt 1 ]; do sleep 2 done kill -9 $pid tput setaf 7 tput setab 0 echo "Hit ENTER to return to your command prompt." tput sgr0 exit 0 } cmd="something complicated that is built at runtime" outfile="ditto" queue="selected at runtime, too" job=`echo "cd \$PBS_O_WORKDIR && $cmd >> $outfile " | qsub -q $queue -e /dev/null -o /dev/null | awk 'BEGIN { FS="." } { print $1 }'` echo "Job $job queued on $queue: $cmd" eval "tail -f -F $outfile 2>/dev/null &" pid=$! watch_queue &
当然,如果我的用户可以从单独的文件中获取作业输出,或者自己在前台和后台之间操作作业,那对我来说会容易得多,但他们不能。他们甚至无法按照脚本中的说明按 Enter 以返回提示的“外观”...而且我无法打开另一个“窗口”-他们没有显示服务器。
最佳答案
您要解决的问题是什么?
现在,这或多或少是一个表面问题。您仍在 shell 中,并且提示仍然存在。只需输入另一个命令,它就会被执行。
或者,在前台运行该函数,或者如果您需要在两者之间执行其他操作,请使用 wait
:
$ fn & pid=$!
$ : something else
$ wait ${pid}
关于bash - 从后台函数打印输出后如何返回 bash 提示符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23125527/