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 .