bash - 从后台函数打印输出后如何返回 bash 提示符?

标签 bash shell background-process pbs torque

如何在打印后台函数的输出后自动返回到我的 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。这个问题的上下文是:

  1. 用户运行脚本
  2. 脚本提交 PBS 作业,开始在后台跟踪输出文件,并调用 fn &
  3. 用户得到提示,可能会开始做其他事情。
  4. 当作业开始运行时,作业输出出现在用户的终端上
  5. fn 监控队列并在作业完成时杀死 tail
  6. 用户提示完成后没有得到提示(即必须按 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/

相关文章:

mysql - 如何将密码从 bash 脚本传递给 aptitude 以安装 mysql?

shell - 替换unix中相似的字符

linux - 从文件名中提取唯一标识

linux - 如何在 ash shell 中保持程序在后台运行

iphone - 检查两个 NSOperationQueue 何时完成调用 endBackgroundTask 以停止后台任务模式

Linux:这是并行运行脚本的正确方法吗?

linux - 如何从 DVD 驱动器运行 1 .sh,从硬盘运行 2nd .sh?

php - 这会阻止我的页面呈现吗?

Android后台蓝牙处理: What's the best approach?

linux - 合并两个 bash 历史文件