长时间运行的命令完成时发出桌面通知

长时间运行的命令完成时发出桌面通知

我希望当一个命令在交互式 shell 中运行超过 15 秒时完成时,都会收到桌面通知。

换句话说,我希望所有命令都包装成类似这样的内容

start=$(date +%s);
ORIGINAL_COMMAND;
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Long running command finished"

在 bash 中实现这一目标的最佳方法是什么?

答案1

据我所知你想要包装器。并且您想通过它使用命令,这样当命令的运行时间超过 15 秒时,它会向您发出所需的通知。所以就是这样。

wrapper(){
    start=$(date +%s)
    "$@"
    [ $(($(date +%s) - start)) -le 15 ] || notify-send "Notification" "Long\
 running command \"$(echo $@)\" took $(($(date +%s) - start)) seconds to finish"
}

将此函数复制到您的~/.bashrc源中~/.bashrc,如下所示,

. ~/.bashrc

用途

wrapper <your_command>

如果需要超过 15 秒,您将收到描述该命令及其执行时间的桌面通知。

例子

wrapper sudo apt-get update

桌面通知的屏幕截图

答案2

其中~/.bashrc有一个别名alert定义为:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

可用于通知命令执行的完成。

用法:

$ the_command; alert

例如

$ sudo apt-get update; alert

snap1

您可以根据您的需要和愿望自定义别名。

答案3

你要https://launchpad.net/undistract-me(可以使用 从 Ubuntu 档案库中安装sudo apt-get install undistract-me)它可以精确地完成您所要求的操作,包括自动工作(也就是说,无需记住在可能长时间运行的命令中添加一些额外的内容)。

答案4

编辑

总结:在 中创建自动完成快捷方式,.inputrc并在 中运行.bashrc 。照常运行命令,输入 ,但不要ENTER按 ,而是按 中指定的快捷方式.inputrc

悬赏这个问题的人说:

“所有现有的答案都需要在命令后输入额外的命令。我想要一个可以自动执行此操作的答案。”

在研究这个问题的解决方案时,我偶然发现来自 stackexchange 的问题,允许绑定CtrlJ到一系列命令:(Ctrla移动到行首),将“mesure”字符串放在您输入的命令前面,Ctrlm(执行)

因此,您可以获得自动完成功能和ENTER用于测量时间的单独命令,同时保留第二我在下面发布的功能。

到目前为止,我的~/.inputrc文件内容如下:

"\C-j": "\C-a measure \C-m"

以下是内容.bashrc(请注意,我一直没用过 bash - 我使用 mksh 作为我的 shell,因此这就是您在原始帖子中看到的内容。功能仍然相同)

PS1=' serg@ubuntu [$(pwd)]
================================
$ '
function measure () 
{

/usr/bin/time --output="/home/xieerqi/.timefile" -f "%e" $@ 

if [ $( cat ~/.timefile| cut -d'.' -f1 ) -gt 15 ]; then

    notify-send "Hi , $@ is done !"

fi


}

原始帖子

这是我的想法 - 使用 中的一个函数.bashrc。基本原理 - 用于/usr/bin/time测量命令完成所需的时间,如果超过 15 秒,则发送通知。

function measure () 
{

if [ $( /usr/bin/time -f "%e" $@ 2>&1 >/dev/null ) -gt 15 ]; then

    notify-send "Hi , $@ is done !"

fi


}

这里我将输出重定向到/dev/null但是为了查看输出,也可以重定向到文件。

我认为,一个更好的方法是将时间输出发送到主文件夹中的某个文件(这样你就不会用时间文件污染你的系统,并且总是知道在哪里查找)。这是第二个版本

function measure () 
{

/usr/bin/time --output=~/.timefile -f "%e" $@ 

if [ $( cat ~/.timefile | cut -d'.' -f1 ) -gt 15 ]; then

    notify-send "Hi , $@ is done !"

fi


}

以下是第一和第二版本的截图(按顺序排列)

第一个版本,没有输出 在此处输入图片描述

第二个版本,带有输出 在此处输入图片描述

相关内容