Команда x-terminal-emulator и логика OR в bash

Команда x-terminal-emulator и логика OR в bash

Странное явление с некоторыми командами bash OR logic, которые я пытаюсь выполнить. Обычно все работает нормально:

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

Это попытается запустить gnome-terminal, а затем запустить вторую часть только в случае сбоя первой команды. Например, если "gnome-terminal" не установлен (или я намеренно изменил его на "XXXXgnome-terminal", чтобы вызвать сбой), будет показана ошибка "notify-send". Но в противном случае вторая команда после "||" никогда не будет запущена, потому что первая команда была выполнена успешно.

Но это действует иначе:

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

Это вызовет окно терминала (вызванное x-terminal-emulator), затем, когда я закрою это окно терминала, оно перейдет к следующей команде и вызовет второе окно терминала (вызванное частью gnome-terminalлогики).

Я понимаю, что x-terminal-emulator — это символическая ссылка, которая просто указывает на терминал по умолчанию. Но, похоже, это заставляет логику OR bash считать, что она «провалилась», даже когда она была успешной.

Я пробовал несколько разных способов обернуть команду x-terminal-emulator (вроде $(x-terminal-emulator)или $(which x-terminal-emulator)), чтобы она более успешно предоставляла логике OR статус "успешно", чтобы команды после нее не запускались. Но пока ничего не сработало.

Идеи?

Суть кодекса заключается в следующем:

  1. Попробуйте вызвать терминал пользователя по умолчанию, если он отличается от gnome-terminal.
  2. Если «x-terminal-emulator» не существует, воспользуйтесь только запуском gnome-terminal.
  3. Если это не помогло, выведите уведомление об ошибке.

Является ли это на самом деле ошибкой вызова x-terminal-emulatorсимволической ссылки или это происходит из-за того, что она в конечном итоге указывает на /usr/bin/gnome-terminal.wrapper, а это не возвращает код «успеха» логике bash?

Редактировать: Хорошо, это делает команду намного длиннее и сложнее на вид, но код ниже, кажется, работает надежно. Он выведет только одно окно терминала и вызовет альтернативное приложение терминала, если gnome-terminalоно не установлено как приложение по умолчанию, но вернется к нему, gnome-terminalесли x-terminal-emulatorне получится. И я должен иметь возможность добавить любое количество других альтернатив, чтобы попробовать:

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

У меня это заработало благодаря предложению @waltinator ниже. Спасибо!

Связанный контент