我希望当一个命令在交互式 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
您可以根据您的需要和愿望自定义别名。
答案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
}
以下是第一和第二版本的截图(按顺序排列)
第一个版本,没有输出
第二个版本,带有输出