Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在后台进程完成后在bashshell中干净地打印消息?_Bash - Fatal编程技术网

如何在后台进程完成后在bashshell中干净地打印消息?

如何在后台进程完成后在bashshell中干净地打印消息?,bash,Bash,我希望在bashshell的后台启动一个漫长的过程,在该过程完成时得到通知,然后以优雅的方式返回到命令行。以下是我目前掌握的情况: echo $(lengthy_process >/dev/null 2&>1 ; printf "consummatum est.\r" ) & 这几乎奏效了。消息“Perfectum est”最终显示出来,但它使我的命令提示符处于丑陋/不确定的状态,文本被插入到我正在键入的内容中 有没有一种方法可以让后台进程打印到

我希望在bashshell的后台启动一个漫长的过程,在该过程完成时得到通知,然后以优雅的方式返回到命令行。以下是我目前掌握的情况:

echo $(lengthy_process >/dev/null 2&>1 ; printf "consummatum est.\r" ) &
这几乎奏效了。消息“Perfectum est”最终显示出来,但它使我的命令提示符处于丑陋/不确定的状态,文本被插入到我正在键入的内容中


有没有一种方法可以让后台进程打印到终端,而不中断我正在做的事情,也不需要回车来让命令提示符进入新状态?

一种更现代的notify send take

( lengthy_process &>/dev/null; notify-send "done" ) &

否则你就是在要求打断。您可能还需要显示退出状态。

您可以创建这样的脚本(
show msg
),用于保存光标位置、打印消息并在退出后恢复光标位置

#! /bin/bash

tput sc; tput cup 0 0
printf '%s
================
PROCESS FINISHED
================
%s\n' "$(tput setab 13)" "$(tput sgr0)"
tput rc
然后

( lengthy_process &>/dev/null; ./show-msg ) &

它将在不干扰您键入的情况下显示消息。

我意识到当最终回显打印其消息时,主shell中的命令提示符仍然处于活动状态,但它正在提示符上打印并输入文本,因此您无法判断发生了什么。(因此,点击enter将执行子进程完成时在命令提示符下写入的任何内容)

在尝试了很多不同的方法之后,我最终选择了一种适合我的目的。在我看来,避免混乱的关键是首先从子shell向主shell发出CTRL-C命令(以取消在漫长的过程完成时可能已写入的任何内容),然后将通知打印到终端

下面是它的样子(使用
sleep3
而不是
long\u过程
):


这是什么软件包?
sudoapt-get-install-libnotify-bin
很好的建议,但我认为这只适用于桌面环境。我正在为服务器上的纯shell使用编写一个脚本。Bash会自动执行此操作,不是吗?后台处理完成后,下次更新提示符时,它将打印
[1]+Done(command)
@wjandrea。有点,是的。我刚刚意识到,在我的上述方法中,命令提示符仍然存在并处于活动状态,但它正在被最终的回音打印出来。所以现在我想知道我是否可以安排某种“完成。按X继续”的顺序,然后清除该消息,以便您可以再次看到提示。这似乎只是将消息打印到屏幕顶部。我的终端需要特殊设置吗?我喜欢它不会干扰在live命令提示符下编写的任何内容(除非在屏幕顶部)。
TOPSHELLPID=$$; ( (TEMP=$(sleep 3; echo -e "kill -INT $TOPSHELLPID; echo '\n\n===============\nConsummatum Est\n===============\n'; kill -INT $TOPSHELLPID" ); bash -c "$TEMP") & )