Как заставить скрипт определять, запущен ли эмулятор терминала в сеансе рабочего стола или нет?
У меня есть сценарии, которые я запускаю, которые записывают текстовый файл, а затем открывают его в редакторе. Если я открою окно эмулятора терминала в сеансе своего рабочего стола и запустлю скрипт, я бы хотел, чтобы редактор был графическим, например gedit
, Но если я вошел в систему через ConnectBot на моем телефоне или чем-то подобном (без сеанса рабочего стола), я бы хотел, чтобы редактор был nano
,
В настоящее время я должен поддерживать 2 разных скрипта, идентичных за исключением последнего шага (или запустить графический скрипт, отключить ошибку, затем вручную открыть файл в nano
). Наличие двух в основном идентичных сценариев неэффективно с точки зрения обслуживания.
Может ли скрипт определить, в какой из этих ситуаций я нахожусь, и открыть правильный редактор?
(Я нашел способы для скрипта определить, запущен ли он в окне эмулятора терминала или двойным щелчком мыши, но пока не нашел способа определить, работает ли окно на рабочем столе... Не думаю, что знать правильную терминологию для Google)
3 ответа
Вы можете использовать переменную среды $DISPLAY
как триггер внутри if
состояние. Обычно, когда эта переменная имеет значение, вы можете запускать графические приложения.
Вот пример bash:
if [[ -z $DISPLAY ]]
then
nano
else
gedit
fi
Оператор -z
вернет истину, когда envvar $DISPLAY
пуст, и ваш скрипт будет работать nano
во всех остальных случаях gedit
,
Согласно этому комментарию vurp0:
На большинстве современных рабочих столов Wayland (таких как стандартные рабочие столы в Fedora и Ubuntu),
$DISPLAY
все еще устанавливается из-за обратной совместимости (через XWayland), но для более надежного сценария было бы хорошо проверить оба$DISPLAY
а также$WAYLAND_DISPLAY
чтобы быть уверенным.
Я бы предложил изменить тестовое выражение следующим образом:
[[ -z ${DISPLAY}${WAYLAND_DISPLAY} ]]
Таким образом, значения двух переменных будут объединены в общую строку, которая будет обработана оператором -z
,
Рекомендации:
Обычно виртуальные терминалы используют /dev/pts
псевдо-терминалы. Итак, исходя из вывода tty
Команда, мы можем построить простую case
оператор для обработки открытия конкретного редактора:
case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac
Или лучше отформатировать:
case "$(tty)" in
"/dev/pts"*) gedit ;;
"/dev/tty"*) nano ;;
*) echo "Not suitable tty" > /dev/stderr ;;
esac
По сравнению с использованием переменных среды, это немного более надежно, и учитывая, что он использует case
заявление с tty
Команда немного более портативна. Что, вероятно, было бы лучше, это объединить оба, с дополнительным тестированием, таким как "/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;
Это то, что я использовал:
# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
exit 1
fi
Причиной для этого кода был этот вопрос: ярлык на рабочем столе для Bash-скрипта падает и горит
Вы можете изменить это так:
# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
nano ...
else
gedit ...
fi