Tendo uma ocorrência estranha com alguns comandos lógicos bash OR que estou tentando. Geralmente tudo funciona bem:
/bin/bash -c "gnome-terminal || notify-send 'ERROR'"
Isso tentará executar o gnome-terminal e só executará a segunda parte se o primeiro comando falhar. Por exemplo, se o "gnome-terminal" não estiver instalado (ou eu o alterar deliberadamente para "XXXXgnome-terminal" para causar falha), ele mostrará o erro "notify-send". Mas caso contrário, o segundo comando após "||" nunca será executado, porque o primeiro comando foi bem-sucedido.
Mas isso funciona de maneira diferente:
/bin/bash -c "x-terminal-emulator || gnome-terminal || notify-send 'ERROR'"
Isso abrirá uma janela de terminal (acionada por x-terminal-emulator
), então, quando eu fechar essa janela de terminal, ele prosseguirá para o próximo comando e abrirá uma segunda janela de terminal (acionada pela gnome-terminal
parte da lógica).
Entendo que o emulador de terminal x é um link simbólico que apenas aponta para o terminal padrão. Mas parece estar fazendo com que a lógica bash OR acredite que "falhou", mesmo quando foi bem-sucedida.
Eu tentei algumas maneiras diferentes de agrupar o comando x-terminal-emulator (como $(x-terminal-emulator)
ou $(which x-terminal-emulator)
) para que ele forneça com mais sucesso à lógica OR um status de "sucesso" para que os comandos depois dele não sejam executados. Mas nada funcionou até agora.
Ideias?
O objetivo do código é:
- Tente chamar o terminal padrão do usuário, caso seja diferente do gnome-terminal.
- Volte a executar apenas o gnome-terminal, se o "x-terminal-emulator" não existir.
- Se isso falhar, mostre uma notificação de erro.
Isso é realmente culpa de chamar o x-terminal-emulator
link simbólico ou está acontecendo porque ele está apontando /usr/bin/gnome-terminal.wrapper
e não está emitindo um código de "sucesso" de volta para a lógica bash?
Editar: OK, isso torna o comando muito mais longo e complexo, mas o código abaixo parece funcionar de maneira confiável. Ele abrirá apenas uma única janela de terminal e chamará o aplicativo de terminal alternativo se gnome-terminal
não estiver definido como padrão, mas retornará gnome-terminal
se x-terminal-emulator
falhar. E devo ser capaz de adicionar inúmeras outras alternativas para tentar:
/bin/bash -c "if [[ -x $(type -p x-terminal-emulator) ]]; then x-terminal-emulator; elif [[ -x $(type -p gnome-terminal) ]]; then gnome-terminal; else notify-send 'ERROR: App not found' 'Install a terminal app'; fi"
Consegui funcionar graças à sugestão do @waltinator abaixo. Obrigado!