Кроссплатформенный метод проверки, используется ли терминальный эмулятор или tty

Вопрос или проблема

Я ищу кроссплатформенный способ проверить, использую ли я терминальный эмулятор (с поддержкой юникодных символов) или сессию TTY (с поддержкой только ASCII символов). Сначала я попытался использовать if [[ $(tty) =~ /dev/tty ]]. Это хорошо сработало на Linux; я смог отличить сессию TTY от терминального эмулятора. Проблема возникает с Mac. Все терминальные эмуляторы Mac возвращают /dev/tty... из команды tty. Затем я увидел предложения использовать $WINDOWID, $DISPLAY и $TERM_PROGRAM. Проблема в том, что не все терминальные эмуляторы устанавливают эти переменные.

Так что мой вопрос таков: существует ли надежный способ определить, используете ли вы терминальный эмулятор или сессию TTY? Я знаю, что теоретически мог бы создать условие, проверяющее все эти параметры, но мне это не очень нравится. Есть ли более чистый способ сделать это?

(Это необходимо для импорта моего приглашения с использованием шрифтов Nerd или нет)

Ответ или решение

Как определить, используется ли терминальный эмулятор или TTY-сессия: кроссплатформенный подход

Для решения задачи определения, используется ли терминальный эмулятор или TTY-сессия, необходимо учитывать различия в реализации между разными операционными системами, такими как Linux и macOS. К сожалению, ваши первоначальные попытки использовать условие if [[ $(tty) =~ /dev/tty ]] показали себя неэффективными на macOS, так как все терминальные эмуляторы возвращают /dev/tty....

Основные переменные окружения

  1. $TERM: Эта переменная указывает на тип терминала. Обычно, если значение TERM начинается с screen или xterm, это указывает на использование терминального эмулятора. Однако, это не всегда универсально.

  2. $WINDOWID и $DISPLAY: Эти переменные обычно устанавливаются в графических средах, но не являются надежными индикаторами, так как не все эмуляторы терминала их устанавливают.

  3. $TERM_PROGRAM: Эта переменная указывает на тип программы терминала и может помочь в идентификации эмулятора, но также не является обязательной.

Кроссплатформенный подход

Наилучшим подходом будет комбинировать несколько проверок в едином скрипте, хотя это может показаться многословным. Вот пример кода, который можно адаптировать под ваши нужды:

is_terminal_emulator() {
    # Проверка, что мы не в стандартной TTY сессии
    if [[ "$(tty)" =~ /dev/tty ]]; then
        return 1  # Это TTY
    fi

    # Проверка переменной $TERM
    case "$TERM" in
        *screen*|*xterm*|*rxvt*|*terminator*|*konsole*|*gnome-terminal*|*kitty*|*iterm2*)
            return 0  # Это терминальный эмулятор
            ;;
        *)
            return 1  # Это TTY
            ;;
    esac
}

# Используйте функцию
if is_terminal_emulator; then
    echo "Используется терминальный эмулятор."
else
    echo "Используется TTY."
fi

Описание логики кода

  1. Проверка tty: Если tty возвращает /dev/tty, это значит, что сессия — TTY.
  2. Проверка TERM: Далее происходит проверка значения переменной $TERM на наличие в ней ключевых слов, часто связанных с эмуляторами терминала.
  3. Объединение результатов: На основе установленных условий скрипт делает вывод о том, используется ли терминальный эмулятор или TTY.

Заключение

Комбинирование условия с проверкой проекта включает в себя определенные компромиссы, но это единственный надежный способ, который учитывает отличия между операционными системами. Использование кроссплатформенного подхода позволяет вам избежать проблем с несовместимостью и делает ваш скрипт более универсальным. Если вы стремитесь использовать дополнительные шрифты, такие как Nerd fonts, этот подход поможет вам правильно их импортировать в зависимости от используемого терминала.

С учетом изложенного, данный метод является оптимальным для достижения желаемого результата и обеспечивает максимальную надежность при выполнении проверки.

Оцените материал
Добавить комментарий

Капча загружается...