gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:51:48 28 4
gpt4 key购买 nike

如何在打印后台函数的输出后自动返回到我的 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com