Comando x-terminal-emulator e lógica bash OR

Comando x-terminal-emulator e lógica bash OR

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-terminalparte 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 é:

  1. Tente chamar o terminal padrão do usuário, caso seja diferente do gnome-terminal.
  2. Volte a executar apenas o gnome-terminal, se o "x-terminal-emulator" não existir.
  3. Se isso falhar, mostre uma notificação de erro.

Isso é realmente culpa de chamar o x-terminal-emulatorlink simbólico ou está acontecendo porque ele está apontando /usr/bin/gnome-terminal.wrappere 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-terminalnão estiver definido como padrão, mas retornará gnome-terminalse x-terminal-emulatorfalhar. 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!

informação relacionada