Вопрос или проблема
Я ищу кроссплатформенный способ проверить, использую ли я терминальный эмулятор (с поддержкой юникодных символов) или сессию 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...
.
Основные переменные окружения
-
$TERM: Эта переменная указывает на тип терминала. Обычно, если значение TERM начинается с
screen
илиxterm
, это указывает на использование терминального эмулятора. Однако, это не всегда универсально. -
$WINDOWID и $DISPLAY: Эти переменные обычно устанавливаются в графических средах, но не являются надежными индикаторами, так как не все эмуляторы терминала их устанавливают.
-
$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
Описание логики кода
- Проверка tty: Если
tty
возвращает/dev/tty
, это значит, что сессия — TTY. - Проверка TERM: Далее происходит проверка значения переменной
$TERM
на наличие в ней ключевых слов, часто связанных с эмуляторами терминала. - Объединение результатов: На основе установленных условий скрипт делает вывод о том, используется ли терминальный эмулятор или TTY.
Заключение
Комбинирование условия с проверкой проекта включает в себя определенные компромиссы, но это единственный надежный способ, который учитывает отличия между операционными системами. Использование кроссплатформенного подхода позволяет вам избежать проблем с несовместимостью и делает ваш скрипт более универсальным. Если вы стремитесь использовать дополнительные шрифты, такие как Nerd fonts, этот подход поможет вам правильно их импортировать в зависимости от используемого терминала.
С учетом изложенного, данный метод является оптимальным для достижения желаемого результата и обеспечивает максимальную надежность при выполнении проверки.