2013-09-24 15 views
12

"ls" cư xử khác nhau khi sản lượng của nó đã được cấp nước tập trung:Làm thế nào để biết được chương trình của tôi đã được cấp nước tập trung khác (Perl)


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

Làm thế nào để nó biết, và làm thế nào tôi sẽ làm điều này trong Perl?

+0

Điều này có vẻ như là một câu hỏi hoàn hảo cho tôi. – friedo

+0

Điều này hơi khác so với câu hỏi khác: nó hỏi về các đường ống đặc biệt, chứ không phải là tty, mặc dù tôi đồng ý có khá nhiều sự trùng lặp. – barrycarter

Trả lời

14

Trong Perl, các nhà điều hành kiểm tra -t tập tin cho biết một filehandle (bao gồm STDIN) được kết nối với một thiết bị đầu cuối.

Ngoài ra còn có toán tử kiểm tra -p để cho biết liệu tệp handhandle có được gắn với một đường ống hay không.

$ 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 

Tài liệu kiểm tra tệp tại perldoc -f -X.

+0

Rất đẹp! Cảm ơn bạn. – barrycarter

6
use IO::Interactive qw(is_interactive); 

is_interactive() or warn "Being piped\n"; 
Các vấn đề liên quan