Tl; dr
Use isto:
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$//p")"'
Simplesmente avaliar $?
novamente não funcionará, porque no momento $?
seria avaliado na segunda vez que ele conteria o status de saída da primeira sub-rotina de comando ( $([ $? = 0 ] && echo terminal || echo error)
) (sempre 0
desde o dois echo
s sempre seriam bem sucedidos). Um truque para contornar isso seria fazer a primeira saída de substituição de comando com um status de saída equivalente novamente:
$([ $? = 0 ] && (echo terminal; exit 0) || (echo error; exit 1))
Dessa forma, $?
pode ser avaliado uma segunda vez para decidir qual cadeia será impressa:
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$//'\'')"'
Em outra nota, seu history|tail -n1|sed -e '\''s/^\s*[0-9]+\s*//;s/[;&|]\s*alert$//'\''
está um pouco sobrecarregado. Isso seria muito mais legível:
history | sed -n "$s/^\s*[0-9]\+\s*\(.*\)[;&|]\s*alert$//p"
Então, comando final:
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$//p")"'
Você pode testar executando (exit 0); alert
e (exit 1); alert
.