Perl -e测试奇怪?

时间:2011-08-01 18:35:36

标签: perl

为什么存在检查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)

更新

我不相信它是shell内置vs外部命令问题。尝试使用外部netstat之类的命令。 pwd是迄今为止我发现的唯一一个命令,它在带有管道的存在检查中返回true。

更新2:

通过我正在进行的几次测试迭代,名为'|的文件pwd'和'pwd |'最终被创造了。这解释了我所看到的。感谢。

1 个答案:

答案 0 :(得分:3)

如果当前目录中有一个名为-e '| pwd'的文件,

| pwd将仅返回true。

如果当前目录中有一个名为-e 'pwd |'的文件,

pwd |将仅返回true。

$ 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