这是Ruby解析器的一个bug吗?
我已经精简了我面临的一个问题,以MWE。有人能确认这是一个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 #!
- 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
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”
,则在输出中只能看到文本*
。您还将看到变量中的空白被保留(回答了问题中的第三点)
这就是为什么您应该始终引用变量的原因之一