2012-01-27 4 views
3

if(-t STDIN)을 평가할 때 < UNIX 연산자는 STDIN으로 계산됩니까? 그렇지 않은 경우 어떻게 데이터를 가져 옵니까?<UNIX의 연산자, Perl 스크립트로 전달

누군가가 perl example.pl < testing.txt을 입력합니다. 이것은 ls | ./example.pl을 통해 파이프 된 데이터처럼 작동하지 않습니다. 그 행동을 어떻게 얻을 수 있습니까?

답변

5

테스트 -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 

은 청각 장애에 연결되어 있는지 여부를 STDIN

ls | ./example.pl 
+1

', 나는 데이터 것을 어떻게 얻는가를' –

2

-t 시험처럼 행동하지 않습니다 말할 때

어쩌면 당신은 당신이 무엇을 의미하는지에 확장 할 수있다.

데이터를 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