Ruby frozen string literal pragma order导致错误

Ruby frozen string literal pragma order caused error

给定一个文件 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 }'

为什么?

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。