3

我有一个 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。

4

2 回答 2

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`;
于 2012-11-30T16:21:43.820 回答
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
  }
}
于 2012-12-01T16:33:07.713 回答