首页 文章

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

提问于
浏览
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”,空目录或不 . 我检查了env值与普通shell和perl脚本相比,它们是相同的 .

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

两台机器都是AIX 6.1,KSH作为默认shell .

2 回答

  • 0

    反引号内的文本被内插,就好像它在传递给OS之前在双引号内 . 跑

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

    确切地看到传递给操作系统的字符串 . 我'll bet you'至少要逃避 $ .

    更安全和更安全的方法是首先构建命令并在后面的反引号中运行它:

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

相关问题