太长不看

太长不看

系统: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,当然,它成功完成:

01违约警报

如果我运行一个无意义的命令,asdfgh; alert我会看到以下内容:

02无意义的命令

terminal图标已被替换为error图标,因为

-i "$([ $? = 0 ] && echo terminal || echo error)"

截至目前,通知只有两项:
- 图标terminalerror取决于“上一个”命令的成功
- 命令本身(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; alertasdfgh; 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因为两个echos 总是会成功)。解决这个问题的一个技巧是让第一个命令替换再次以等效的退出状态退出:

$([ $? = 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

相关内容