Я хочу выполнить какое-либо действие только в том случае, если моя оболочка «подключена» к терминалу, т.е. только если мой стандартный ввод поступает от входа терминала, а мой стандартный вывод (и стандартная ошибка? Может быть, это не имеет значения) выводится на печать терминал.
Как я могу это сделать, не полагаясь на специфику GNU / Linux (например /proc/self
) напрямую?
command-line
terminal
einpoklum - восстановить Монику
источник
источник
Ответы:
isatty
это функция для проверки этого , и-t
флагtest
команды делает это доступным из сценария оболочки:Вы можете проверить, является ли FD 0 (стандартный ввод) TTY с помощью:
Вы можете сделать то же самое для FD 1 и 2, чтобы проверить выходные данные и потоки ошибок, или все из них:
Команда возвращает 0 (успешно), если дескрипторы подключены к терминалу, в противном случае - false.
test
также доступна в качестве[
команды для «брекет-теста»:идиоматический способ написать это условно.
источник
Я представляю, что это дубликат, но я не могу его найти. использование
а также
соответственно проверить, подключены ли стандартный вход и выход к терминалу.
man test
есть детали.источник
Просто дополнительная заметка поверх прекрасных ответов, которые уже были даны. Обратите внимание, что
[ -t 0 ]
проверяется, что файловый дескриптор 0 открыт один файл, который является файлом устройства с дисциплиной tty line (как правило, это делается путем проверки успешного выполнения безвредных termio (s) ioctl ()).Кроме того, это не обязательно означает, что на другом конце есть терминал или эмулятор терминала (с реальным пользователем, печатающим на клавиатуре) (хотя в огромном большинстве случаев и, вероятно, в большинстве тех, которые вас волнуют, этого достаточно приближение).
Устройства tty и pty также могут использоваться для передачи данных или в качестве механизма межпроцессного взаимодействия.
Например, можно сделать:
Чтобы передать то, что получено через RS232
myscript
.будет иметь
myscript
«ы стандартного ввода будучи в PTy устройство (сsshd
на другом конце, и в конце концов (через соединение SSH) не терминал, а трубку , питаемуюecho
)Чтобы дополнительно проверить наличие терминала на другом конце этой линии RS232 или pty, вы также можете проверить, что
$TERM
переменная установлена и не пуста ([ -n "$TERM" ]
), и отправить управляющую последовательность отчета о состоянии устройства через этот fd и проверить, что вы получаете ответ (в дополнение к[ -t 0 ]
и[ -n "$TERM" ]
).Ответили
\e[0n
большинством терминалов.Теперь есть несколько проблем с этим, поэтому я бы не рекомендовал делать это, за исключением случая, когда вы хотите проверить это, потому что вы хотите запустить визуальное приложение TUI (в этом случае вам лучше использовать такие библиотеки, как
ncurses
, и вместо DSR вы бы предпочли отправить управляющую последовательность идентификации устройства, чтобы запросить тип терминала более точно, чем через$TERM
):printf
к сбою, но в случае, если stdin является устройством tty, открытым в режиме чтения + записи, это будет иметь побочный эффект отправки этой последовательности на другой конец. Например, в нашем примере ssh, который на самом деле будет отправлять последовательность на терминал (но ответ не будет поступать на стандартный ввод)источник