Просто дополнительная заметка поверх прекрасных ответов, которые уже были даны. Обратите внимание, что [ -t 0 ]проверяется, что файловый дескриптор 0 открыт один файл, который является файлом устройства с дисциплиной tty line (как правило, это делается путем проверки успешного выполнения безвредных termio (s) ioctl ()).
Кроме того, это не обязательно означает, что на другом конце есть терминал или эмулятор терминала (с реальным пользователем, печатающим на клавиатуре) (хотя в огромном большинстве случаев и, вероятно, в большинстве тех, которые вас волнуют, этого достаточно приближение).
Устройства tty и pty также могут использоваться для передачи данных или в качестве механизма межпроцессного взаимодействия.
Например, можно сделать:
(stty raw -echo; myscript) < /dev/ttyS0
Чтобы передать то, что получено через RS232 myscript.
echo test | ssh -tt host myscript
будет иметь myscript«ы стандартного ввода будучи в PTy устройство (с sshdна другом конце, и в конце концов (через соединение SSH) не терминал, а трубку , питаемую echo)
Чтобы дополнительно проверить наличие терминала на другом конце этой линии RS232 или pty, вы также можете проверить, что $TERMпеременная установлена и не пуста ( [ -n "$TERM" ]), и отправить управляющую последовательность отчета о состоянии устройства через этот fd и проверить, что вы получаете ответ (в дополнение к [ -t 0 ]и [ -n "$TERM" ]).
printf >&0 '\e[5n'
Ответили \e[0nбольшинством терминалов.
Теперь есть несколько проблем с этим, поэтому я бы не рекомендовал делать это, за исключением случая, когда вы хотите проверить это, потому что вы хотите запустить визуальное приложение TUI (в этом случае вам лучше использовать такие библиотеки, как ncurses, и вместо DSR вы бы предпочли отправить управляющую последовательность идентификации устройства, чтобы запросить тип терминала более точно, чем через $TERM):
- К счастью, в большинстве случаев, когда stdin не является терминалом, он будет открыт в режиме только для чтения, что может привести
printfк сбою, но в случае, если stdin является устройством tty, открытым в режиме чтения + записи, это будет иметь побочный эффект отправки этой последовательности на другой конец. Например, в нашем примере ssh, который на самом деле будет отправлять последовательность на терминал (но ответ не будет поступать на стандартный ввод)
- Трудно и достоверно прочитать ответ. Вам нужно будет временно изменить дисциплину линии tty и читать по одному байту за раз. Вам также необходимо определить тайм-аут, по которому, если ответ не виден, вы сдаетесь и решаете, что терминала нет. Если вы хотите учесть людей, набирающих номер через спутниковую связь, это означает длительный тайм-аут.
- Чтение из терминала в фоновом режиме приостановит ваш скрипт с помощью сигнала SIGTTIN.