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

Этот ответ отвечает на ваш вопрос. В общем случае лучше всего использовать Windows для исправления ошибок на жестких дисках NTFS.

Но поскольку это NTFS, единственный способ действительно восстановить NTFS - это утилита chkdsk для Windows. (Существует команда ntfsfix, но она не будет такого же качества исправления, как и утилиты Windows для проверки дисков NTFS).

Мой личный опыт согласуется с этим.

10
задан 21 May 2018 в 15:10

7 ответов

Вы можете использовать переменную среды $DISPLAY в качестве триггера в состоянии if. Обычно, когда эта переменная имеет значение, вы можете запускать графические приложения.

Вот пример bash:

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

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

В соответствии с этим комментарием :

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

Я бы предложил изменить тестовое выражение следующим образом:

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

Таким образом, значения двух переменных будут объединены в общую строку, которая будет обработана с помощью оператора -z.

Ссылки:

Расширенное руководство по созданию Bash-скриптов: 7. Тесты Advanced Bash-Scripting Guide: 7.1. Test Constructs Advanced Bash-Scripting Guide: 7.3. Другие операторы сравнения
9
ответ дан 22 May 2018 в 10:32
  • 1
    Или для явной логики: [[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]] – Dennis Williamson 22 May 2018 в 00:00

Вы можете использовать переменную среды $DISPLAY в качестве триггера в состоянии if. Обычно, когда эта переменная имеет значение, вы можете запускать графические приложения.

Вот пример bash:

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

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

В соответствии с этим комментарием :

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

Я бы предложил изменить тестовое выражение следующим образом:

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

Таким образом, значения двух переменных будут объединены в общую строку, которая будет обработана с помощью оператора -z.

Ссылки:

Расширенное руководство по созданию Bash-скриптов: 7. Тесты Advanced Bash-Scripting Guide: 7.1. Test Constructs Advanced Bash-Scripting Guide: 7.3. Другие операторы сравнения
13
ответ дан 17 July 2018 в 13:48

Вы можете использовать переменную среды $DISPLAY в качестве триггера в состоянии if. Обычно, когда эта переменная имеет значение, вы можете запускать графические приложения.

Вот пример bash:

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

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

В соответствии с этим комментарием :

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

Я бы предложил изменить тестовое выражение следующим образом:

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

Таким образом, значения двух переменных будут объединены в общую строку, которая будет обработана с помощью оператора -z.

Ссылки:

Расширенное руководство по созданию Bash-скриптов: 7. Тесты Advanced Bash-Scripting Guide: 7.1. Test Constructs Advanced Bash-Scripting Guide: 7.3. Другие операторы сравнения
13
ответ дан 20 July 2018 в 13:52

Обычно виртуальные терминалы используют псевдо-терминалы /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 ;;

7
ответ дан 17 July 2018 в 13:48

Это то, что я использовал:

# $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
3
ответ дан 17 July 2018 в 13:48

Обычно виртуальные терминалы используют псевдо-терминалы /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 ;;

7
ответ дан 20 July 2018 в 13:52
  • 1
    +1 для "красиво" вариант :) – WinEunuuchs2Unix 22 May 2018 в 15:30
  • 2
    Разве это не так? На моей консоли Ctrl + Alt + F1, tty дает /dev/tty1, тогда как gnome-terminal (первая вкладка) дает /dev/pts/0. – Paddy Landau 29 May 2018 в 14:25
  • 3
    @PaddyLandau Да, gedit должен быть в /dev/pts* случае. Я включил их во время тестирования ошибок в tty и закончил копирование его здесь без переключения. Спасибо, отредактирован уже. – Sergiy Kolodyazhnyy 29 May 2018 в 17:40

Это то, что я использовал:

# $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
3
ответ дан 20 July 2018 в 13:52

Другие вопросы по тегам:

Похожие вопросы: