在 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'name
或 some\folder\incorrect"name
。我还需要删除那些 files/folder。
但是使用我的代码时出现 EOF 错误或 file/folder 不存在错误。
使用 q
或 qq
时,引号已从文件名中删除,导致 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" );
我有列出 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'name
或 some\folder\incorrect"name
。我还需要删除那些 files/folder。
但是使用我的代码时出现 EOF 错误或 file/folder 不存在错误。
使用 q
或 qq
时,引号已从文件名中删除,导致 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" );