为什么存在检查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 |'最终被创造了。这解释了我所看到的。感谢。
答案 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