Как заставить скрипт определять, запущен ли эмулятор терминала в сеансе рабочего стола или нет?

У меня есть сценарии, которые я запускаю, которые записывают текстовый файл, а затем открывают его в редакторе. Если я открою окно эмулятора терминала в сеансе своего рабочего стола и запустлю скрипт, я бы хотел, чтобы редактор был графическим, например 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
Другие вопросы по тегам