DK *_*ose 6 notification command-line bash
系统:Lubuntu 14.04 LTS
我想知道是否可以修改以特定方式alert提供的别名~/.bashrc。这是原文alert:
# Add an "alert" alias for long running commands. Use like so:
# sleep 10; 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$//'\'')"'
Run Code Online (Sandbox Code Playgroud)
使用默认别名“alert”解释了它的作用。
这是xfce4-notify我运行时系统上的默认通知示例(使用)ls; alert,当然,它成功完成:
如果我运行一个无意义的命令asdfgh; alert,我会看到:
该terminal图标已经被替换error,因为图标
-i "$([ $? = 0 ] && echo terminal || echo error)"
Run Code Online (Sandbox Code Playgroud)
截至目前,通知只有两个项目:
- 图标是terminal或error取决于“上一个”命令的成功
- 命令本身(ls在第一种情况和asdfgh第二种情况下)
我可以修改现有别名以在命令上方包含一行文本,如下所示:
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "Task finished" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
Run Code Online (Sandbox Code Playgroud)
然后,如果我运行ls; alert并asdfgh; alert收到如下所示的通知。
我的问题是:两个通知都显示“任务完成”,但是可以再次应用用于决定是显示图标还是显示terminal图标的相同逻辑来确定在命令上方显示哪个文本字符串?因此,如果图标显示,文本将是“任务完成”,但如果图标显示,文本可能类似于“出现问题!”errorterminalerror
用这个:
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && (echo terminal; exit 0) || (echo error; exit 1))" "$([ $? = 0 ] && echo Task finished || echo Something went wrong!)" "$(history | sed -n "\$s/^\s*[0-9]\+\s*\(.*\)[;&|]\s*alert\$/\1/p")"'
Run Code Online (Sandbox Code Playgroud)
简单地再次评估$?是行不通的,因为到$?第二次评估时,它将包含第一个命令替换的 ( $([ $? = 0 ] && echo terminal || echo error)s ) 退出状态(总是0因为两个echos 总是成功)。解决这个问题的一个技巧是使第一个命令替换再次以等效的退出状态退出:
$([ $? = 0 ] && (echo terminal; exit 0) || (echo error; exit 1))
Run Code Online (Sandbox Code Playgroud)
可以再次评估这种方式$?,以便决定打印哪个字符串:
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && (echo terminal; exit 0) || (echo error; exit 1))" "$([ $? = 0 ] && echo Task finished || echo Something went wrong!)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]+\s*//;s/[;&|]\s*alert$//'\'')"'
Run Code Online (Sandbox Code Playgroud)
另一方面,你的history|tail -n1|sed -e '\''s/^\s*[0-9]+\s*//;s/[;&|]\s*alert$//'\''有点过于复杂。这会更具可读性:
history | sed -n "\$s/^\s*[0-9]\+\s*\(.*\)[;&|]\s*alert\$/\1/p"
Run Code Online (Sandbox Code Playgroud)
所以,最终命令:
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && (echo terminal; exit 0) || (echo error; exit 1))" "$([ $? = 0 ] && echo Task finished || echo Something went wrong!)" "$(history | sed -n "\$s/^\s*[0-9]\+\s*\(.*\)[;&|]\s*alert\$/\1/p")"'
Run Code Online (Sandbox Code Playgroud)
您可以通过运行(exit 0); alert和进行测试(exit 1); alert。