系统: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$//'\'')"'
使用默认别名“alert”解释它的作用。
xfce4-notify
下面是运行时系统上的默认通知示例(使用) ls; alert
,当然,它成功完成:
如果我运行一个无意义的命令,asdfgh; alert
我会看到以下内容:
该terminal
图标已被替换为error
图标,因为
-i "$([ $? = 0 ] && echo terminal || echo error)"
截至目前,通知只有两项:
- 图标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$//'\'')"'
然后,如果我运行ls; alert
,asdfgh; alert
我会收到下面显示的通知。
我的问题是:两个通知都显示“任务完成”,但是否可以用相同的逻辑来决定是否显示terminal
图标或图标error
再次应用确定命令上方显示的文本字符串是什么?因此,如果terminal
显示图标,则文本将是“任务完成”,但如果error
显示图标,则文本可能是“出现问题!”
答案1
太长不看
用这个:
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")"'
简单地$?
再次求值是行不通的,因为到$?
第二次求值时,它将包含第一个命令替换 ( $([ $? = 0 ] && echo terminal || echo error)
's) 的退出状态(总是如此,0
因为两个echo
s 总是会成功)。解决这个问题的一个技巧是让第一个命令替换再次以等效的退出状态退出:
$([ $? = 0 ] && (echo terminal; exit 0) || (echo error; exit 1))
$?
可以再次评估这种方式以决定打印哪个字符串:
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$//'\'')"'
另一方面,您的代码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"
因此,最终命令:
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")"'
您可以通过运行(exit 0); alert
和来测试(exit 1); alert
。