【发布时间】:2014-04-17 05:49:12
【问题描述】:
如何在打印后台函数的输出后自动返回到我的 bash 提示符?
例如,当我在 bash shell 中运行以下脚本时:
fn(){ 睡觉 10 回声“完成” 出口 } fn&运行脚本后,它立即返回我的提示。 10 秒后,它会打印“Done”,然后在新行上显示一个闪烁的光标:
$ 完成 ▏脚本不再运行,但在我按下 Return 之前我没有得到提示。
打印“完成”后有什么方法可以强制返回到 bash 提示符?
一个相关的问题是:Is there a way for a backgrounded task to inform the terminal to print a new prompt? 但是,该问题询问的是后台程序。那里提供的答案适用于发送到后台的 program,但似乎不适用于发送到后台的 function(如示例中所示)我提供了)。
澄清一下:我希望保存上面的整个代码 sn-p(例如,myscript.sh),然后将其作为前台脚本运行(例如,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 来获得提示的“外观”......而且我无法打开另一个“窗口” - 他们没有显示服务器。
【问题讨论】:
-
zsh解决方案到底有什么问题?是不是你没有zsh环境中定义的函数? -
对我来说效果很好。
zsh --version报告zsh 5.0.2 (x86_64-pc-linux-gnu)。我完全使用了问题中的fn,除了 3 而不是 10。 -
@rici 我不想在提示符下运行“fn &” - 我想在前台脚本中运行整个事情(fn 的定义后跟“fn &”)。这在 zsh 中对我不起作用。
-
也许你需要澄清你的问题,因为我根本不清楚。这个问题似乎与您正在启动另一个
zsh实例有关。如果您使用.(或等效的source)执行脚本文件,它似乎可以按预期工作。我尝试了几个不同的zsh选项,但似乎都没有帮助,而且我不是zsh专家(甚至不是粉丝)。祝你好运。 -
@rici 我实际上是在寻找
bash的答案,而不是zsh- 我的用户因为没有得到提示而感到慌乱,一个新的外壳可能会让他们的脑袋爆炸:) 我澄清了我的问题,谢谢你的建议。
标签: bash shell background-process pbs torque