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

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

Tengo un suceso extraño con algunos comandos bash O lógicos que estoy intentando. Normalmente todo funciona bien:

/bin/bash -c "gnome-terminal || notify-send 'ERROR'"

Esto intentará ejecutar gnome-terminal y luego solo ejecutará la segunda parte si el primer comando falla. Por ejemplo, si "gnome-terminal" no está instalado (o lo cambio deliberadamente a "XXXXgnome-terminal" para provocar que falle), mostrará el error "notificar-enviar". Pero por lo demás, el segundo comando después de "||" nunca se ejecutará porque el primer comando tuvo éxito.

Pero esto actúa de manera diferente:

/bin/bash -c "x-terminal-emulator || gnome-terminal || notify-send 'ERROR'"

Esto abrirá una ventana de terminal (llamada por x-terminal-emulator), luego, cuando cierro esa ventana de terminal, pasará al siguiente comando y abrirá una segunda ventana de terminal (llamada por la gnome-terminalparte de la lógica).

Entiendo que x-terminal-emulator es un enlace simbólico que solo apunta al terminal predeterminado. Pero parece estar causando que la lógica bash OR crea que "falló" incluso cuando tuvo éxito.

Probé un par de formas diferentes de empaquetar el comando x-terminal-emulator (como $(x-terminal-emulator)o $(which x-terminal-emulator)) para que proporcione con mayor éxito la lógica OR con un estado de "éxito" para que los comandos posteriores no se ejecuten. Pero hasta ahora nada ha funcionado.

¿Ideas?

El objetivo del código es:

  1. Intente llamar a la terminal predeterminada del usuario, en caso de que sea diferente de gnome-terminal.
  2. Vuelva a ejecutar gnome-terminal, si "x-terminal-emulator" no existe.
  3. Si eso falla, muestra una notificación de error.

¿Es esto realmente culpa de llamar al x-terminal-emulatorenlace simbólico, o está sucediendo porque en última instancia apunta /usr/bin/gnome-terminal.wrappery no emite un código de "éxito" a la lógica de bash?

Editar: OK, hace que el comando sea mucho más largo y parezca más complejo, pero el código siguiente parece funcionar de manera confiable. Solo abrirá una única ventana de terminal y llamará a la aplicación de terminal alternativa si gnome-terminalno está configurada como predeterminada, pero recurrirá a ella gnome-terminalsi x-terminal-emulatorfalla. Y debería poder agregar otras alternativas para probar:

/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"

Lo hice funcionar gracias a la sugerencia de @waltinator a continuación. ¡Gracias!

información relacionada