Странное явление с некоторыми командами 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 статус "успешно", чтобы команды после нее не запускались. Но пока ничего не сработало.
Идеи?
Суть кодекса заключается в следующем:
- Попробуйте вызвать терминал пользователя по умолчанию, если он отличается от gnome-terminal.
- Если «x-terminal-emulator» не существует, воспользуйтесь только запуском gnome-terminal.
- Если это не помогло, выведите уведомление об ошибке.
Является ли это на самом деле ошибкой вызова 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 ниже. Спасибо!