这是Ruby解析器的一个bug吗?

这是Ruby解析器的一个bug吗?,ruby,bash,Ruby,Bash,我已经精简了我面临的一个问题,以MWE。有人能确认这是一个bug还是我遗漏了一些基本的东西吗 平台: Ruby 1.9.3p484(2013-11-22修订版43786)[x86_64-linux] GNUBash,版本4.3.11(1)-发行版(x86_64-pc-linux-GNU) Ubuntu 14.04.2 x86_64 步骤1:创建一个名为demo.rb的Ruby脚本 puts "[Line 1]" puts "* [Line 2] *" 步骤2:创建一个名为driver #!

我已经精简了我面临的一个问题,以MWE。有人能确认这是一个bug还是我遗漏了一些基本的东西吗

平台

  • Ruby 1.9.3p484(2013-11-22修订版43786)[x86_64-linux]
  • GNUBash,版本4.3.11(1)-发行版(x86_64-pc-linux-GNU)
  • Ubuntu 14.04.2 x86_64
步骤1:创建一个名为
demo.rb的Ruby脚本

puts "[Line 1]"
puts "* [Line 2] *"
步骤2:创建一个名为
driver

#!/bin/bash

ret=`ruby ./demo.rb `
echo $ret
步骤3:将上面两个文件移动到一个空文件夹中

步骤4:从
bash
运行
driver
。如您所见,它列出了父目录的内容以及每个
put
调用

$ ./driver
[Line 1] demo.rb driver [Line 2] demo.rb driver
步骤5:如果直接从
bash
执行
demo.rb
,它将生成:

$ ruby demo.rb 
[Line 1]
* [Line 2] *
现在,从
的两端删除星号(
*
),将
字符串放入
demo.rb的第二行:

puts "[Line 1]"
puts " [Line 2] "
如果我重复步骤4

$ ./driver 
[Line 1] [Line 2]
如果我重复步骤5

$ ruby demo.rb 
[Line 1]
 [Line 2] 
我无法理解以下内容:

  • 为什么第一次尝试时输出包含目录列表
  • 为什么删除星号会在第二次尝试中抑制目录列表
  • 如果我分别重复步骤4和步骤5,为什么在第二次尝试中输出不同

  • 1和2:与Ruby无关,与Bash有关
    *
    是一个,当文件名出现在bash命令中时,它将扩展到文件名列表。试试这个:

    $ echo *
    $ a="*"; echo $a
    $ a="DIR: * ; DIR AGAIN: *"; echo $a
    
    3:因为
    echo
    打印由空格分隔的参数;换行符被视为空格。看看这个:

    $ a=`cat /etc/services`
    $ echo $a
    $ echo "$a"
    

    echo$a
    会将所有行弄脏为一行。如果使用双引号,可以将
    $a
    的内容保护为一个参数,并保留换行符。(同样的逻辑也适用于
    echo“$ret”

    在我看来,这是标准的全局扩展行为

    当您在shell脚本中执行echo$ret时,字符串中的
    *
    将扩展到目录的内容

    如果在其周围加上引号
    echo“$ret”
    ,则在输出中只能看到文本
    *
    。您还将看到变量中的空白被保留(回答了问题中的第三点)

    这就是为什么您应该始终引用变量的原因之一