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