35

在 ruby​​ 程序开始时编写以下命令有什么用?

#!/usr/local/bin/ruby -w

它是操作系统特定的命令吗?它对 Windows 上的 ruby​​ 有效吗?如果不是,那么 windows 中的等效命令是什么?

4

3 回答 3

72

它被称为Shebang。它告诉程序加载器使用什么命令来执行文件。因此,当您运行时./myscript.rb,它实际上转换为/usr/local/bin/ruby -w ./myscript.rb.

Windows 使用文件关联来达到同样的目的;shebang 线没有效果(编辑:见 FMc 的回答)但也不会造成伤害。

一种可移植的方式(例如,在 Cygwin 和RVM下工作)将是:

#!/usr/bin/env ruby

这将使用env命令找出 Ruby 解释器的位置,然后运行它。

编辑:显然,Cygwin 将与行为不端/usr/bin/env ruby -w并尝试查找ruby -w而不是ruby. 您可能希望将效果-w放入脚本本身。

于 2013-07-03T12:10:29.947 回答
33

Shebang 行是可选的,如果您运行 ruby​​ 解释器并将脚本作为命令行参数传递给它,那么您在命令行上设置的标志就是运行 ruby​​ 的标志。

Shebang 线根本不是 ruby​​(除非您想将其称为 ruby​​ 注释)。这真的是 shell 脚本。大多数 linux 和 unix 用户都在运行 BASH shell(代表 Borne Again SHell),但几乎每个操作系统都有一个支持 Shebang 的命令解释器。

“#!/usr/local/bin/ruby -w”

“她”部分是八字号​​ (#),又名井号、数字符号、井号,现在是井号(我仍然称它为井字棋,只是因为)。

“砰”的部分是感叹号(!),就像用拳头在桌子上敲击以发出命令一样。

在 Windows 上,“Shell”是命令提示符,但即使没有黑色 DOS 窗口,命令解释器也会根据文件关联运行脚本。命令解释器或编程语言是否正在读取 shebang 并确保标志被尊重并不重要,重要的是,它们被尊重。

“-w”是一个标志。基本上,这是 ruby​​ 在运行脚本时要遵循的指令。在这种情况下,“-w”会打开警告,因此在脚本执行期间您会收到额外的警告(脚本继续运行)或错误(脚本停止运行)。可以在程序期间捕获并处理警告和异常。这些帮助程序员发现导致意外行为的问题。

我喜欢快速而肮脏的脚本来完成工作,所以不-w。我也是高质量可重用编码的粉丝,所以一定要使用 -w。适合工作的正确工具。如果您正在学习,请始终使用 -w。当您知道自己在做什么并停止在快速任务上使用 -w 时,您将开始弄清楚何时使用 -w 会有所帮助,而不是花费数小时进行故障排除。(提示,当问题的原因不是很明显时,只需添加 -w 并运行它以查看您得到的结果)。

“-w”需要一些额外的编码来明确你的意思,所以它不会立即解决问题,但如果你已经用 -w 编写代码,那么添加必要的位将不会有太多麻烦使一个带有警告的小脚本运行。事实上,如果你习惯于使用 -w,那么你可能已经在用这种方式编写代码,而且 -w 不会改变任何东西,除非你忘记了某些东西。Ruby 需要的“管道代码”远少于 C++ 等大多数(可能是所有)编译语言,因此选择不使用 -w 不会让您节省大量输入,它只会让您在尝试运行脚本之前少思考(恕我直言) )。

-v 是详细模式,不会改变脚本的运行(不会发出警告,不会在新位置停止脚本)。一些站点和讨论调用 -w 详细模式,但 -w 是警告模式,它会更改脚本的执行。

于 2016-01-19T06:12:54.457 回答
11

尽管 shebang 行的执行行为不会直接转换为 Windows 世界,但该行中包含的标志(例如-w您的问题中的标志)确实会影响正在运行的 Ruby 脚本。

Windows 机器上的示例 1:

#!/usr/local/bin/ruby -w
puts $VERBOSE   # true

Windows 机器上的示例 2:

#!/usr/local/bin/ruby
puts $VERBOSE   # false
于 2013-07-03T12:45:42.557 回答