Как узнать, подключена ли моя программа к другому (Perl)

"ls" ведет себя по-разному, когда его выход передается по трубопроводу:

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

Как это знать, и как я могу это сделать в Perl?

Ответ 1

В Perl оператор проверки файла -t указывает, является ли дескриптор файла (включая STDIN) подключен к терминалу.

Существует также оператор -p test, чтобы указать, является ли дескриптор файла прикрепляется к трубе.

$ 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.

Ответ 2

use IO::Interactive qw(is_interactive);

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