在 Perl 中执行包含引号的 shell 命令

Executing shell command containing quotations in Perl

我有列出 files/folders 要在 unix 上删除的方法。然后我用代码删除它:

for my $line (@linesFiles) {
    my $command = "rm '$line';"; # or my $command = "rmdir '$line';";
    my ($stdout, $stderr) = capture {
        system ($command);
        };      
    }

Mots 的时间它工作,但有时 files/folders 有不正确的名称包含引号,如 some\folder\incorrect'namesome\folder\incorrect"name。我还需要删除那些 files/folder。

但是使用我的代码时出现 EOF 错误或 file/folder 不存在错误。 使用 qqq 时,引号已从文件名中删除,导致 file/folder 不存在错误。

谁能帮我修改代码,这样它就可以删除 files/folders 包含任何潜在危险(至少在这种情况下)的字符,例如 " ' $ { } ?

要构建 shell 命令,您可以使用 String::ShellQuote (or Win32::ShellQuote).

use String::ShellQuote qw( shell_quote );

my $shell_cmd = shell_quote( "rm", "--", $qfn );
system( $shell_cmd );
die( "Couldn't launch shell to unlink \"$qfn\": $!\n" )                             if $? == -1;
die( "Shell killed by signal ".( $? & 0x7F )." while trying to unlink \"$qfn\"\n" ) if $? & 0x7F;
die( "Shell exited with error ".( $? >> 8 )." while trying to unlink \"$qfn\"\n" )  if $? >> 8;


但为什么要涉及 shell 呢?您可以使用 system 的 multi-argument 形式。

system( "rm", "--", $qfn );
die( "Couldn't launch rm to unlink \"$qfn\": $!\n" )                             if $? == -1;
die( "rm killed by signal ".( $? & 0x7F )." while trying to unlink \"$qfn\"\n" ) if $? & 0x7F;
die( "rm exited with error ".( $? >> 8 )." while trying to unlink \"$qfn\"\n" )  if $? >> 8;

但为什么要使用外部工具呢。您可以使用 unlink 删除文件。

unlink( $qfn )
   or die( "Can't unlink \"$qfn\": $!\n" );