【问题标题】:Ruby different results for "%x{something}" where "something" is quoted or unquoted"%x{something}" 的 Ruby 不同结果,其中 "something" 被引用或不被引用
【发布时间】:2013-09-18 23:16:56
【问题描述】:

我在 Windows 7 下使用 Ruby (2.0) %x{dir} 运行 DOS dir 命令。正在执行的dir 根据是否引用dir 而有所不同。

当命令是空的时,我得到一个 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...

当我用单引号或双引号引用dir 命令时,我会返回PATH 中的GnuWin32 dir.exe 命令的输出。我花了一段时间才弄清楚 GNU dir 正在运行。是什么导致 Ruby 使用 dir 内置于 CMD.EXE 与 c:\PROGRA~2\GnuWin32\bin\dir.EXE 中的 dir ???

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

【问题讨论】:

  • 我的猜测是生成(或不生成)子外壳。
  • 这确实有些道理。 `cmd` 的文档说:返回在子 shell 中运行 cmd 的标准输出。引用 cmd 时,我找不到有关行为差异的任何信息。

标签: ruby shell-exec


【解决方案1】:

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

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

当你在 cmd 中加引号时,它会强制 cmd.exe 在路径上查找该命令,而不是通过它的内部函数。

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

>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 等实用程序可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2018-08-14
    • 2013-03-11
    • 2019-10-02
    • 1970-01-01
    • 2016-05-11
    相关资源
    最近更新 更多