Оператор <в UNIX, переход на скрипт Perl - PullRequest
3 голосов
/ 27 января 2012

При оценке if(-t STDIN) считается ли оператор

Так что кто-то печатает perl example.pl < testing.txt. Это не ведет себя как данные, передаваемые через ls | ./example.pl. Как я могу получить такое поведение?

Ответы [ 2 ]

5 голосов
/ 27 января 2012

Тест -p STDIN, который проверяет, прикреплен ли дескриптор файла STDIN к каналу.

touch foo
perl -e 'print -p STDIN' < foo            # nothing
cat foo | perl -e 'print -p STDIN'        # 1

Но я не уверен, что понимаю ваш вопрос. Во всех этих трех случаях

1.  perl -e 'print $_=<STDIN>' < <(echo foo)
2.  echo foo | perl -e 'print $_=<STDIN>'
3.  perl -e 'print $_=<STDIN>'          # then type "foo\n" to the console

входы одинаковы и доступны через файловый дескриптор STDIN. В первых двух случаях -t STDIN будет иметь значение false, а во втором случае -p STDIN будет иметь значение true.

Различия в поведении между этими тремя случаями неуловимы и обычно не важны. Третий случай, очевидно, будет ждать, пока не будет получена хотя бы одна строка ввода (оканчивающаяся на «\ n» или EOF). Разница между первыми двумя случаями еще более тонкая. Когда входные данные для вашей программы передаются из выходных данных другого процесса, вы в некоторой степени зависите от этого первого процесса в отношении задержки или от того, буферизует ли эта программа свой вывод.

Может быть, вы могли бы расширить то, что вы имеете в виду, когда говорите

perl example.pl < testing.txt

не ведет себя как

ls | ./example.pl
2 голосов
/ 27 января 2012

-t проверяет, присоединен ли STDIN к tty.

Когда вы передаете данные в perl, они не будут привязаны к tty. Это не должно зависеть от механизма, который вы используете для конвейерной передачи (т. Е. От того, передаете ли вы команду с помощью | или передаете файл с помощью <.) Однако при непосредственном запуске программы у вас будет подключен tty. Учитывая следующий пример:

#!/usr/bin/perl
print ((-t STDIN) ? "is a tty\n" : "is not a tty\n");

Ожидается следующий вывод:

% perl ./ttytest.pl
is a tty
% perl ./ttytest.pl < somefile
is not a tty
% ls | perl ./ttytest.pl
is not a tty
...