Як розпізнати сценарій, якщо емулятор термінала працює на робочому столі або ні?


10

У мене є сценарії, якими я запускаю текстовий файл, а потім відкриваю його в редакторі. Якщо я відкрию вікно емулятора терміналу на своєму робочому сеансі та запускаю сценарій, я хотів би, щоб редактор був таким графічним, як gedit. Але якщо я ввійду через ConnectBot на своєму телефоні або подібному (без сеансу на робочому столі), я хотів би бути редактором nano.

В даний час мені доводиться підтримувати 2 різні сценарії, однакові за винятком останнього кроку (або дозволити графічний запуск, помилка, а потім відкрийте файл вручну nano). Наявність двох переважно однакових сценаріїв неефективно з точки зору обслуговування.

Чи може скрипт виявити, в якій із цих ситуацій я перебуваю, і відкрити правильний редактор?

(Я знайшов способи для скрипта визначити, працює він у вікні емулятора терміналу чи двічі клацнув, але ще не знайшов способу визначити, чи вікно працює на робочому столі ... Я не думаю, що знати правильну термінологію для google)


6
Якщо ваш сценарій призначений для використання іншими людьми, вам слід використовувати програму, задану $EDITORза замовчуванням замість nano, а також резервну копію, nanoякщо вона не встановлена.
Бакуріу

Дякую, чудова порада, і чудово чути, що є гарною практикою. Тільки я хоч.
Органічний мармур

Відповіді:


13

Ви можете використовувати змінну оточення $DISPLAYяк тригер в ifумові. Зазвичай, коли ця змінна має значення, ви можете запускати графічні програми.

Ось приклад:

if [[ -z $DISPLAY ]]
then
    nano
else
    gedit
fi

Оператор -zповерне значення true, коли envvar $DISPLAYпорожній і ваш сценарій запуститься nano, у всіх інших випадках він запуститься gedit.


Відповідно до цього коментаря @ vurp0 :

На більшості сучасних настільних комп’ютерів Wayland (як-то робочий стіл за замовчуванням у Fedora та Ubuntu) $DISPLAYвсе ще встановлено завдяки зворотній сумісності (через XWayland), але для більш надійного сценарію було б добре перевірити і те, $DISPLAYі інше $WAYLAND_DISPLAY.

Я б запропонував змінити тестовий вираз наступним чином:

[[ -z ${DISPLAY}${WAYLAND_DISPLAY} ]]

Таким чином, значення двох змінних будуть об'єднані в загальний рядок, який буде оброблятися оператором -z.


Список літератури:


1
Або для явної логіки:[[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]]
Призупинено до подальшого повідомлення.

7

Зазвичай віртуальні термінали використовують /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 ;;


Хіба це не так? На моїй консолі Ctrl + Alt + F1 ttyдає /dev/tty1, тоді як gnome-terminal(перша вкладка) дає /dev/pts/0.
Падді Ландау

@PaddyLandau Так, geditмає бути на /dev/pts*випадок. Я переключив їх під час тестування помилок у tty і в кінцевому підсумку скопіював його тут, не перемикаючись назад. Дякуємо, вже відредаговано.
Сергій Колодяжний

3

Це те, що я використовував:

# $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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.