Perl -e Испытание на странность? - PullRequest
2 голосов
/ 01 августа 2011

Почему существует эта проверка, возвращающая разные результаты для pwd по сравнению с другими примерами?Что здесь происходит?

[me@unixbox1:~/perltests]> cat testopensimple.pl
#!/usr/bin/perl

use strict;
use warnings;

# |<command> for writing
# <command>| for reading

testopen("| pwd");
testopen("pwd |");
testopen("| hostname");
testopen("| cd");
testopen("| sh");
testopen("| sleep 2");

sub testopen {
        my $command = shift;

        print "Exists: " . (-e $command ? "true" : "false") . "\n";
        print "testopen($command)\n";
        eval {
                open(my $fh, $command) or die "$! $@";
                my $data = join('', <$fh>);
                close($fh) or die "$! $@";
                print $data . "\n";
        };
        if ($@) {
                print $@ . "\n";
        }
}

[me@unixbox1:~/perltests]> perl testopensimple.pl
Exists: true
testopen(| pwd)
/home/me/perltests

Exists: true
testopen(pwd |)
/home/me/perltests

Exists: false
testopen(| hostname)
unixbox1

Exists: false
testopen(| cd)

Exists: false
testopen(| sh)

Exists: false
testopen(| sleep 2)

Обновление:

Я не уверен, что это проблема встроенной в оболочку команды против внешней команды.Попробуйте с помощью команды, подобной netstat, которая является внешней.pwd - единственная команда, которую я до сих пор нашел, которая возвращает true для проверки существующих с каналами.

Обновление 2:

В ходе нескольких итераций, которые я выполнял, файлы с именем«|pwd 'и' pwd | 'в конечном итоге был создан.Это объясняет, что я вижу.Спасибо.

1 Ответ

3 голосов
/ 01 августа 2011

-e '| pwd' вернет true, только если у вас есть файл с именем | pwd в текущем каталоге.

-e 'pwd |' вернет true, только если у вас есть файл с именем pwd | в текущем каталоге.

$ perl -E'say -e "| pwd" ? 1 : 0'
0

$ touch '| pwd'

$ perl -E'say -e "| pwd" ? 1 : 0'
1

$ perl -E'say -e "pwd |" ? 1 : 0'
0

$ touch 'pwd |'

$ perl -E'say -e "pwd |" ? 1 : 0'
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...