perl - 将带引号的字符串传递给system(),使引号保持完整

标签 perl exec quotes

此问题适用于Windows 10上的Perl v5.24.0
除了最简单的情况。在程序之间传递命令行和参数列表始终是一个问题。考虑到空格和 shell 元字符的影响,可能使数据在多个级别的调用中保持完整,可能会导致一堆转义符和引号
Elixir 一直是使用system的多参数形式(它也尝试避免将shell称为中介),以便可靠地分隔每个参数而无需使用引号
这样的电话

system("dir \"C:\\Program Files\\\"")
这样写在眼睛上要容易得多
system('dir', 'C:\Program Files\\')
但是,我看不到任何传递包含引号的值的方法
如果我写一个测试程序
show.pl
use Data::Dump;
dd \@ARGV;
然后打电话
system('show', 'xxx')
那么我得到的输出就是我所期望的
["xxx"]
但是,假设我想传递字符串"xxx"。如果我尝试
system('show', '"xxx"')
然后在该过程中的某些时候将引号除去,并且输出与前面的示例相同
如何调用system以使输出为["\"xxx\""]
我已经尝试了各种逃避方法,但是解决方案使我回避了

最佳答案

问题:

system($^X, '-E', 'say @ARGV', '"test"');

输出:
test

太坏了![1]

解决方案:
use Win32::ShellQuote qw( quote_system );

system(quote_system($^X, '-E', 'say @ARGV', '"test"'));

输出:
"test"

  • 即使不使用Shell,Perl也需要构建命令行。与unix中执行程序的system call获取程序路径和参数列表不同,unix中执行程序的Windows system call采用命令行,因此即使避免使用shell,也必须构建命令行。似乎Perl错误地构建了命令行。[2]这就是为什么使用system BLOCK LIST语法无济于事的原因。
  • 实际上,由应用程序来解析命令行中的参数!值得庆幸的是,有一个system call可以做到这一点,因此就形成了一个标准。
  • 关于perl - 将带引号的字符串传递给system(),使引号保持完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38221923/

    相关文章:

    perl - 在使用 ("XXX"时不能使用字符串 "strict refs") 作为符号引用

    perl - 带有模板工具包的行号

    php - 从更新的命令行输出中获取百分比 - Regex 和 PHP

    postgresql - 在 PostgreSQL 中使用 crosstab() 时引号不正确

    bash - 转义单引号 ssh 远程命令

    java - 在 JDBC 中转义单引号(出现错误 : You have an error in your SQL syntax . ..)

    windows - Windows 上的 Perl GUI 编程

    perl - 如何在 bash shell 脚本中的 perl 命令调用中使用 shell 变量?

    python - 如何使用 exec 动态导入模块

    c - 如何获取通过exec调用的父进程中已执行应用程序的状态?