12

"ls" 在其输出被管道传输时表现不同:

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

它是如何知道的,我将如何在 Perl 中做到这一点?

4

2 回答 2

13

在 Perl 中,-t文件测试运算符指示文件句柄(包括STDIN)是否连接到终端。

还有一个-p测试运算符来指示文件句柄是否附加到管道。

$ 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

将测试操作员文档归档在perldoc -f -X.

于 2013-09-24T21:07:54.760 回答
6
use IO::Interactive qw(is_interactive);

is_interactive() or warn "Being piped\n";
于 2013-09-24T21:07:12.470 回答