shell命令进出perl脚本的结果不同

时间:2012-11-30 16:15:46

标签: perl ssh

我有一个perl脚本,需要检查远程计算机上的空目录。使用ksh我可以使用以下shell脚本:

ksh# ssh user@host '[ "$(ls -A /empty/dir/* 2>/dev/null)" ] && echo "1" || echo "0"'

如果目录为空或不存在,则正确返回“0”。仅当目录包含某些内容时,它才返回“1”。

当我将此行放在perl脚本中时,尽管如此:

#!/usr/bin/perl
print `ssh user\@host '[ "$(ls -A /empty/dir/* 2>/dev/null)" ] && echo "1" || echo "0"'`

无论我放在那里,它都会返回一个“1”的空目录。与普通shell和perl脚本相比,我检查了env值,它们是相同的。

有没有人知道为什么这个命令只会在perl脚本中返回不同的结果?

两台机器都是AIX 6.1,KSH是默认shell。

2 个答案:

答案 0 :(得分:2)

内部反引号中的文本被内插,就像它在传递给操作系统之前在双引号内一样。运行

print qq`ssh user\@host '[ "$(ls -A /empty/dir/* 2>/dev/null)" ] && echo "1" || echo "0"'`

准确查看传递给操作系统的字符串。我打赌你至少要逃过$

更安全和更安全的方法是先建立你的命令,然后在反引号中运行它:

# q{...} does no interpolation
my $cmd = q{ssh user\@host '[ "$(ls -A /empty/dir/* 2>/dev/null)" ] && echo "1" || echo "0"'};
print `$cmd`;

答案 1 :(得分:0)

use Net::SFTP::Foreign;

my $s = Net::SFTP::Foreign->new('user@host');
my $empty = 1;
if (my $d = $s->opendir('/empty/dir')) {
  if (defined $s->readdir($d)) {
    $empty = 0
  }
}