„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?
„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?
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
.
Sehr schön! Vielen Dank. – barrycarter
use IO::Interactive qw(is_interactive);
is_interactive() or warn "Being piped\n";
Das scheint mir eine vollkommen gute Frage zu sein. – friedo
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