【问题标题】:running a shell command that is quoted运行引用的 shell 命令
【发布时间】:2013-09-19 03:58:01
【问题描述】:

在我的 Perl 程序中,我得到了一个变量,该变量具有以下内容:

echo -e \"use\nseveral\nlines\"

我想通过shell(使用exec)运行这个命令

echo -e "use\nseveral\nlines"

在将变量传递给 exec 之前,我在变量上尝试了 eval,但这解释了 \n 并将它们更改为换行符。

编辑:

请注意,我得到了变量,并且无法控制它的输入方式。因此,鉴于变量是这样输入的,有没有办法“取消引用”它?

【问题讨论】:

    标签: perl bash readline


    【解决方案1】:

    在 Perl 中,您应该使用 q{}qq{}(或 qx{} 执行)以避免复杂的引号转义。

    这应该对你有用(使用q{} 以避免插值\n):

    my $str = q{echo -e "use\nseveral\nlines"};
    

    现在,您可以使用qx 执行它:

    qx{$str}
    

    【讨论】:

    • 谢谢,mvp。我的问题应该更清楚:我被赋予了变量并且无法控制它的输入方式。因此,鉴于变量是这样输入的,有没有办法“取消引用”它?
    • 最后我能够访问图书馆,它是手动引用的。所以取消引用我必须用正则表达式反转手动引号。
    【解决方案2】:

    当你通过时

    echo -e \"use\nseveral\nlines\"
    

    到 shell,它将以下三个参数传递给 exec 系统调用:

    echo
    -e
    use\nseveral\nlines
    

    如何创建最后一个字符串?这里有几种方法:

    "use\\nseveral\\nlines"  # Escape \W chars in double-quoted strings.
    'use\\nseveral\\nlines'  # Escape \ and delimiters in single-quoted strings
    'use\nseveral\nlines'    #    ...although it's optional if unambiguous.
    

    因此相应的 Perl 命令是

    exec('echo', '-e', 'use\nseveral\nlines');
    
    system('echo', '-e', 'use\nseveral\nlines');
    
    open(my $fh, '-|', 'echo', '-e', 'use\nseveral\nlines');
    my @output = <$fh>;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 2018-04-07
      • 2015-06-13
      相关资源
      最近更新 更多