在perl脚本中运行系统命令,该脚本具有" @"字符

时间:2015-10-27 18:54:39

标签: perl

我有一个这样的系统命令:

unix_command "@output_file path_to_file" 

现在,当我在perl脚本中尝试execsystem命令时,我收到此错误:

  

在期待操作员时获取字符串。

你能帮我解决一下如何在Perl中做到这一点。

感谢您的帮助。

非常感谢! 勒凯什

2 个答案:

答案 0 :(得分:4)

system实际上是两个不同的功能。

您可以使用它来启动程序。

以下语法用于启动程序:

system($prog, @one_or_more_args)
system({ $prog }, $arg0, @args)

使用其中一种语法,所有作为参数传递的字符串都不会被传递给子程序。

使用示例:

system('perl', '-e', 'my @a = "foo"; print "@a\n";');

您可以使用它来执行shell命令。

以下语法用于执行shell命令:

system($shell_cmd)

以上是

的简称
system('/bin/sh', '-c', $shell_cmd)

您必须提供有效的shell命令。你正在构建命令,你需要注意正确地逃避任何需要逃逸的事情。

使用示例:

use String::ShellQuote qw( shell_quote );

my $cmd = shell_quote('perl', '-e', 'my @a = "foo"; print "@a\n";');
system($cmd);

对你的情况更具体一点,shell命令

program @file1 file2

可以按如下方式执行:

system('program', '@'.$file1, $file2);

如果您确实需要构造一个shell命令(例如,因为您想重定向输出),则可以使用以下命令:

use String::ShellQuote qw( shell_quote );

my $cmd = shell_quote('program', '@'.$file1, $file2) . ' >output.txt 2>&1';
system($cmd);

答案 1 :(得分:2)

如果您不需要插值,请使用单引号。

system 'echo @a';

如果这样做,请使用反斜杠。

system "echo \@a";