2013-09-24 12 views
12

"ls" si comporta in modo diverso quando la sua uscita viene convogliata:Come sapere se il mio programma viene convogliato ad un altro (Perl)


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

Come fa a sapere, e come farei questo in Perl?

+0

Questa mi sembra una domanda perfettamente soddisfacente. – friedo

+0

Questo è leggermente diverso dall'altra domanda: si tratta di pipe specifiche, non di ttys, anche se sono d'accordo che c'è un po 'di sovrapposizione. – barrycarter

risposta

14

In Perl, l'operatore di verifica -t file indica se un filehandle (compresi STDIN) è collegato ad un terminale.

C'è anche l'operatore di prova -p per indicare se un filehandle è collegato a una pipe.

$ 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 

Documentazione operatore file di prova su perldoc -f -X.

+0

MOLTO bello! Grazie. – barrycarter

6
use IO::Interactive qw(is_interactive); 

is_interactive() or warn "Being piped\n"; 
Problemi correlati