2013-09-24 2 views
12

„ls“ geleitet wird verhält sich anders, wenn sein Ausgang geleitet wird:Wie kann man sagen, wenn mein Programm in eine andere (Perl)


> ls ??? 
bar foo 
> ls ??? | cat 
bar 
foo 

Wie funktioniert es wissen, und wie würde ich tun dies in Perl?

+0

Das scheint mir eine vollkommen gute Frage zu sein. – friedo

+0

Das ist etwas anders als bei der anderen Frage: es fragt nach Rohren, nicht nach Tönen, obwohl ich zustimme, dass es ziemlich viele Überschneidungen gibt. – barrycarter

Antwort

14

In Perl, der -t Datei anzeigt, ob ein Testoperator Dateihandle (einschließlich STDIN) an ein Endgerät angeschlossen ist.

Es gibt auch den -p Testoperator, um anzugeben, ob ein Dateihandle an eine Pipe angeschlossen ist.

$ perl -e 'printf "term:%d, pipe:%d\n", -t STDIN, -p STDIN' 
term:1, pipe:0 
$ perl -e 'printf "term:%d, pipe:%d\n", -t STDIN, -p STDIN' < /tmp/foo 
term:0, pipe:0 
$ echo foo | perl -e 'printf "term:%d, pipe:%d\n", -t STDIN, -p STDIN' 
term:0, pipe:1 

Datei Test Operator Dokumentation unter perldoc -f -X.

+0

Sehr schön! Vielen Dank. – barrycarter

6
use IO::Interactive qw(is_interactive); 

is_interactive() or warn "Being piped\n"; 
Verwandte Themen