/ / <оператор в UNIX, преминавайки към скрипт на Perl - perl, команден ред, stdin

<оператор в UNIX, преминаващ към Perl script - perl, командния ред, stdin

При оценяване if(-t STDIN), счита ли <UNIX оператора STDIN? Ако не, как да получа тези данни?

Така че някой пише perl example.pl < testing.txt, Това не се държи като данни, подадени чрез ls | ./example.pl, Как мога да получа това поведение?

Отговори:

5 за отговор № 1

Тест -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 "foon" to the console

входовете са еднакви и всички достъпни чрез STDIN filehandle. В първите два случая, -t STDIN ще оцени на невярно, а във втория случай, -p STDIN ще бъде вярно.

Разликите в поведението между тези трислучаите са фини и обикновено не са важни. Третият случай очевидно ще изчака, докато се получи поне един ред на въвеждане (прекратен с "n" или EOF). Разликата между първите два случая е още по-фина. Когато входът към вашата програма е изведен от изхода на друг процес, вие сте донякъде на милостта на този първи процес по отношение на латентността или дали тази програма буферира изхода си.

Може би бихте могли да разширите какво имате предвид, когато казвате

perl example.pl < testing.txt

не се държи така

ls | ./example.pl

2 за отговор № 2

-t тестове независимо дали STDIN е прикрепен към tty.

Когато изпращате данни към perl, те няма да бъдат прикачени към tty. Това не трябва да зависи от механизма, който използвате за тръба (т.е. от това, дали използвате тръбна команда | или тръба на файл с помощта <.) Въпреки това, ще имате прикачен tty, когато стартирате програмата директно. Като се има предвид следният пример:

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

Можете да очаквате следния резултат:

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