Ruby冻结字符串文字的pragma命令导致错误

时间:2016-03-17 15:11:43

标签: ruby ruby-2.3

给定一个Ruby 2.3.0p0的文件:

#!/usr/bin/env ruby

# frozen_string_literal: true

# Exit cleanly from an early interrupt
Signal.trap("INT") { abort }

这很好。

# frozen_string_literal: true

#!/usr/bin/env ruby

# Exit cleanly from an early interrupt
Signal.trap("INT") { abort }

会导致错误:

syntax error near unexpected token `"INT"'
`Signal.trap("INT") { abort }'

为什么?

1 个答案:

答案 0 :(得分:4)

shebang必须出现在文件的初始行。

包含以下内容的文件test.rb

#!/usr/bin/env ruby    
# foo bar
puts "hello from #{RbConfig.ruby}"

将通过Ruby运行:

$ ./test.rb
hello from /.../ruby-2.3.0/bin/ruby

但如果test.rb包含:(第1和第2行交换)

# foo bar
#!/usr/bin/env ruby
echo "hello from $SHELL"

它将作为普通的shell脚本运行:

$ ./test.rb
hello from /.../bin/zsh

因此,您所获得的错误不是Ruby错误,而是来自您的shell。