“%x{something}”的 Ruby 不同结果,其中“something”被引用或不被引用

Ruby different results for "%x{something}" where "something" is quoted or unquoted

提问人:mnemotronic 提问时间:9/19/2013 最后编辑:mnemotronic 更新时间:9/27/2013 访问量:236

问:

我在 Windows 7 下使用 Ruby (2.0) 运行 DOS 命令。执行的次数因是否被引用而异。%x{dir}dirdirdir

当命令是裸的时,我得到DOS dir命令的完整输出:

# sends output of cmd back to program
puts 'run %x{dir}'
puts "dir= " + %x{dir}

我在命令行上看到的:

run %x{dir}
dir=  Volume in drive C is System
 Volume Serial Number is FFFF-FFFF

 Directory of C:\Users\ ...etc...

08/26/2013  09:16 AM    <DIR>          .
08/26/2013  09:16 AM    <DIR>          ..
01/28/2013  02:28 AM            10,958 AJAX RUG Test.tsc
 ...etc...

当我用单引号或双引号引用命令时,我得到了 GnuWin32 命令的输出,该命令位于 .我花了一段时间才弄清楚 GNU 正在运行。是什么原因导致 Ruby 使用内置的 into vs. ???dirdir.exePATHdirdirCMD.EXEc:\PROGRA~2\GnuWin32\bin\dir.EXE

另外,我刚刚注意到我的“Pickaxe”和“Ruby Cookbook”使用“%x{}”语法(大括号),而在线文档使用“%x()”(PARENS)......这只是 Ruby 的一般分隔符匹配情况吗?

ruby shell-exec

评论

2赞 user2246674 9/19/2013
生成(或不生成)子壳是我的猜测。
0赞 mnemotronic 9/19/2013
这确实是有道理的。'' 的文档说: 返回在子 shell 中运行 cmd 的标准输出。当引用 cmd 时,我找不到任何有关行为差异的信息。cmd

答:

2赞 Steve Midgley 9/27/2013 #1

这是 Windows 的特点,而不是 Ruby。这是怎么回事:

Dir 不是可执行文件,而是 Windows/cmd.exe 的本机函数。(它是 cmd.exe 的一部分 - 因此当您键入 dir 并运行内部函数而不是在文件路径上查找“dir.exe”或其他内容时,cmd.exe 会“陷阱”)。

当您在 cmd 中将某些内容放在引号中时,它会强制 cmd.exe 在路径上查找该命令,而不是通过其内部函数。

您可以通过在 Windows 中打开命令提示符并键入内置命令(gnuwin32 中不存在)来测试这一点,例如 copy:

>copy
The syntax of the command is incorrect.

>"copy"
'"copy"' is not recognized as an internal or external command,
operable program or batch file.

如果随后创建包含以下内容的“copy.cmd”文件:

已执行 echo copy.cmd

跑步时,您会看到:

>"copy"
copy.cmd executed

有意义?基本上引用你从 Ruby 发送到 shell 的命令 (cmd.exe) 会导致 cmd 的不同解释.exe它会阻止内部/内置 cmd.exe命令(如 dir 和 copy)工作,而外部实用程序(如 xcopy)可以正常工作。