提问人:mnemotronic 提问时间:9/19/2013 最后编辑:mnemotronic 更新时间:9/27/2013 访问量:236
“%x{something}”的 Ruby 不同结果,其中“something”被引用或不被引用
Ruby different results for "%x{something}" where "something" is quoted or unquoted
问:
我在 Windows 7 下使用 Ruby (2.0) 运行 DOS 命令。执行的次数因是否被引用而异。%x{dir}
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...
当我用单引号或双引号引用命令时,我得到了 GnuWin32 命令的输出,该命令位于 .我花了一段时间才弄清楚 GNU 正在运行。是什么原因导致 Ruby 使用内置的 into vs. ???dir
dir.exe
PATH
dir
dir
CMD.EXE
c:\PROGRA~2\GnuWin32\bin\dir.EXE
另外,我刚刚注意到我的“Pickaxe”和“Ruby Cookbook”使用“%x{}”语法(大括号),而在线文档使用“%x()”(PARENS)......这只是 Ruby 的一般分隔符匹配情况吗?
答:
这是 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)可以正常工作。
评论
cmd