我已经减少了我面对MWE的问题。任何人都可以确认这是一个错误还是我遗漏了一些不成熟的东西?
平台:
第1步:创建一个名为demo.rb
puts "[Line 1]"
puts "* [Line 2] *"
第2步:创建名为driver
#!/bin/bash
ret=`ruby ./demo.rb `
echo $ret
第3步:将上面的文件移到空文件夹中。
第4步:从driver
运行bash
。如您所见,它会在每个puts
调用时列出父目录的内容。
$ ./driver
[Line 1] demo.rb driver [Line 2] demo.rb driver
第5步:如果直接从demo.rb
执行bash
,则会产生:
$ ruby demo.rb
[Line 1]
* [Line 2] *
现在,从*
第二行puts
字符串的两端删除星号(demo.rb
):
puts "[Line 1]"
puts " [Line 2] "
如果我重复步骤4,
$ ./driver
[Line 1] [Line 2]
如果我重复步骤5,
$ ruby demo.rb
[Line 1]
[Line 2]
我无法理解以下内容:
答案 0 :(得分:7)
1& 2:与Ruby无关,与Bash有关。 *
是glob,在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"
)
答案 1 :(得分:2)
看起来像我的标准全球扩展行为。
在shell脚本中执行echo $ret
时,字符串中的*
会扩展为目录的内容。
如果您在echo "$ret"
周围加上引号,那么您只会在输出中看到文字*
。您还会看到变量中的空格被保留(回答您问题中的第三点)。
这是你应该总是引用变量的原因之一!