Тестирование -t STDIN и -t <STDIN>

Я пишу исполняемый Perl-скрипт, назовем его SCRIPT, который принимает выходные данные другой команды, выполняемой из командной строки, и что-то делает с этими выводами.

Например

$ diff файлA файлB | СЦЕНАРИЙ

Но если я вызываю SCRIPT, не помещая его после канала, я хочу сигнализировать об ошибке.

Следующий MWE работает правильно, но я не уверен, что понимаю, почему.

#!/usr/bin/perl
use strict;
use warnings;

if ( -t STDIN )
  {
    print "NOTHING PIPED IN\n";
  }
else
  {
    while ( my $line = <STDIN> )
      {
        print ">> " . $line;
      }
  }

1;

Я не могу найти документацию о том, что делает -t. Я имею в виду, что могу обнаружить, что он проверяет, открыт ли Filehandle для терминала. Но я не уверен, что это значит. Я также не понимаю, почему я должен использовать STDIN без оператора угла.

Другими словами,

if ( -t <STDIN> )

либо зависает, если не на принимающем конце канала, либо я теряю первую строку передаваемых данных. (То, что я теряю первую строку передаваемых данных, на самом деле имеет для меня смысл.)

Я ожидал чего-то другого. Я ожидал, что мне придется написать код следующим образом:

#!/usr/bin/perl
use strict;
use warnings;

if ( -t STDIN )
  {
    while ( my $line = <STDIN> )
      {
        print ">> " . $line;
      }
  }
else
  {
    print "NOTHING PIPED IN\n";
  }

1;
  • Что такое -t STDIN на самом деле тестирование с точки зрения непрофессионала.
  • Почему он возвращает true, когда ничего не передается?
  • Почему, если это ложь, я могу читать из <STDIN> в цикле while?

Флаг -t спрашивает: «Этот файл подключен к терминалу?» Если вы ничего не передавали по конвейеру, то стандартный ввод будет читаться с вашего терминала.

Tim Roberts 22.08.2024 00:59

@ТимРобертс, ок. Это немного помогает. Почему я могу протестировать его без оператора угла?

A.Ellett 22.08.2024 01:03

Не то, что вы спросили, но: если вы действительно хотите проверить, является ли STDIN трубкой, вы можете сказать -p STDIN. Обратите внимание: если вы перенаправите файл в свой скрипт, -p STDIN будет ложным, а ! -t STDIN будет истинным.

user20284150 22.08.2024 15:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

<STDIN> — сокращение от readline( STDIN ). Вы не хотите читать ни строчки; вы хотите проверить, подключен ли дескриптор файла к терминалу.

tty — это терминал.[1] В unix tty — это особый класс символьных устройств. (Подробнее об этом позже.) По сути, это относится к интерактивному интерфейсу с пользователем.[2]

-t, задокументировано как функция -X , тесты — это предоставленный дескриптор файла, подключенный к tty. Например, он может в конечном итоге вызвать внутренний вызов isatty.

Ранее я говорил, что tty — это особый класс символьных устройств. Это означает, что некоторые символьные устройства не являются tty. Но что более важно, это также означает, что дескрипторы файлов, которые не являются символьными устройствами, также не могут быть tty. Другие типы дескрипторов файлов включают «обычный файл», каталог, сокет, канал и блочное устройство. -t вернет false для дескриптора, подключенного к любому из них.

$ printf '' >file

$ perl -Mv5.14 -e'say -t STDIN ? 1 : 0'              # Happens to be a tty.
1

$ perl -Mv5.14 -e'say -t STDIN ? 1 : 0' </dev/tty    # Definitely a tty.
1

$ perl -Mv5.14 -e'say -t STDIN ? 1 : 0' </dev/null   # Char dev that's not a TTY
0

$ perl -Mv5.14 -e'say -t STDIN ? 1 : 0' <file        # Plain file.
0

$ printf '' | perl -Mv5.14 -e'say -t STDIN ? 1 : 0'  # Pipe
0

  1. Это сокращение от «телетайп» и «телетайп», что восходит к тем временам, когда люди удаленно подключались к компьютеру с помощью комбинаций пишущих машинок и принтеров вместо того, чтобы подключать к ним клавиатуру и мониторы.
  2. Также существует тип tty, называемый псевдо-tty, который позволяет программам взаимодействовать с другими программами, как если бы они были пользователями.

Эти примеры чрезвычайно наглядны и полезны. Спасибо.

A.Ellett 22.08.2024 01:30

Другие вопросы по теме

Текстовая ролевая игра, позволяющая перемещаться между комнатами, игнорирует все операторы if, проверяющие местоположение
Не равно нулю Vs != null (Unity C#)
Операторы if для обработки определенного числового значения переменной всегда попадают в последний оператор if, независимо от значения переменной
Кратные 3 или 5. Можно ли это сделать с помощью операторов else if?
Как заставить этот метод всегда возвращать неотрицательное значение?
Python, elif вызвал проблему, а остальное - нет
Почему сравнение дат (с использованием функции «ЕСЛИ») возвращает неожиданный результат?
Excel – вывод формулы ЕСЛИ ИСТИНА изменяется на основе аргумента ЛОЖЬ? (с выходом DROP и VSTACK)
Как я могу переписать этот блок if/Else if в более структурированный, сжатый и оптимальный вид. (С#)
Можно ли использовать оператор else if для поэтапного раскрытия элементов с помощью JavaScript?