"ls" 在其输出被管道传输时表现不同:
> ls ???
bar foo
> ls ??? | cat
bar
foo
它是如何知道的,我将如何在 Perl 中做到这一点?
在 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
.
use IO::Interactive qw(is_interactive);
is_interactive() or warn "Being piped\n";