Отметьте дескриптор как терминал для теста -t

Можно проверить, подключен ли дескриптор к терминалу с -t тестом.

if [ ! -t 0 ]; then echo "Stdin is not from terminal" fi 

Имея дескриптор X, указывая на файл или на процесс (с перенаправлением> (cmd)), можно ли сделать его похожим на терминал? Для теста -t пройти?

  • Как перенаправить stdout справа налево
  • Трейлинг пространства при копировании из gnome-терминала с использованием zsh
  • Как получить доступ к fpath пользователя, в отличие от fpath системы со сценарием?
  • ZSH: история поиска по клавишам вверх и вниз?
  • / etc / zprofile или / etc / zsh / zprofile
  • Что есть? "^ [B" backward-word "При попытке настроить ZSH?
  • Остановить ZSH от попытки исправления команды
  • Матрицы стиля Zsh с Bash
  • 2 Solutions collect form web for “Отметьте дескриптор как терминал для теста -t”

    Вместо >(cmd) , считая, что stdin cmd вы хотите быть tty вместо трубы, вы можете попробовать и использовать:

     >(socat -u - exec:'cmd',pty) 

    socat будет использовать пару псевдо-tty и иметь stdin cmd , подключенный к подчиненной части ( [ -t 0 ] вернет true).

    Псевдотерминал будет переведен в необработанный режим, поэтому линейная дисциплина не должна мешать данным, поэтому в этом отношении она более или менее эквивалентна трубе.

    Однако псевдотерминалы не могут быть закрыты на одном конце, как трубы. Итак, socat не может сказать cmd что больше нет ввода. Вместо этого, после того, как stdin Socat достигнет конца файла, socat будет немного подождать и уничтожить псевдо-tty, что обычно означает, что cmd получает SIGHUP.

    Если ваша команда занимает больше времени для обработки данных или ждет окончания файла на stdin, прежде чем начинать что-либо делать, это не будет работать должным образом.

    Команда test запускает isatty(fd) чтобы проверить, связан ли дескриптор с TTY.

    isatty(3) – это функция библиотеки C, которая проверяет, позволяет ли дескриптор файла отправлять вызовы ioctl(2) терминала в дескриптор.

    Поэтому вы не можете подделать результат, если не используете LD_PRELOAD= для перезаписывания функции isatty() в оболочке.

    Linux и Unix - лучшая ОС в мире.