Modifique o alias de “alerta” em ~ / .bashrc

5

Sistema: Lubuntu 14.04 LTS

Eu quero saber se é possível modificar o alert alias fornecido em ~/.bashrc de uma maneira específica. Este é o original 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$//'\'')"'

O uso do alias padrão “alert” explica o que acontece.

E aqui está um exemplo da notificação padrão no meu sistema (usando xfce4-notify ) quando executo ls; alert , o que, é claro, é concluído com êxito:

Se eu executar um comando sem sentido, asdfgh; alert , vejo isso:

O ícone terminal foi substituído pelo ícone error devido a

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

A partir de agora, a notificação tem apenas dois itens:
  - o ícone que é terminal ou error dependendo do sucesso do comando "anterior"
  - o comando em si ( ls no primeiro caso e asdfgh no segundo)

Eu posso modificar o alias existente para incluir uma linha de texto acima do comando assim:

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$//'\'')"'

Então, se eu executar ls; alert e asdfgh; alert , receberei as notificações mostradas abaixo.

Minha pergunta é a seguinte: as duas notificações mostram "Tarefa concluída", mas a mesma lógica usada para decidir se o ícone terminal ou o ícone error é exibido ser aplicado novamente para determinar qual string de texto é mostrada acima do comando? Portanto, se o ícone terminal for exibido, o texto será "Tarefa concluída", mas se o ícone error for exibido, o texto pode ser algo como "Algo deu errado!"

    
por DK Bose 23.03.2016 / 06:35

1 resposta

3

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 .

    
por kos 23.03.2016 / 07:05