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

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

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

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

  • zsh отказывается принять новый сценарий автозаполнения
  • Определение путей использования автозаполнения zsh
  • Безмоментный запуск задачи в фоновом режиме
  • Что означают буквы в команде `fc`?
  • сценарий к cd во многие каталоги и выполнить команду
  • Как я могу достичь root после переключения с bash на zsh?
  • Как заставить команды выделяться жирным шрифтом в zsh?
  • Расширение {a..d} до abcd в zsh
  • 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 - лучшая ОС в мире.