English 中文(简体)
在Ubuntu中运行Ruby时使用#!注释
原标题:
  • 时间:2009-01-08 08:42:15
  •  标签:

我是编程新手,正在尝试跟随使用Ruby中的#!注释的示例。

I am consistently get the message: bash: matz.rb: command not found

I am using this comment: #! /usr/bin/env ruby

我已经尝试了加了和没有加"!"之间的空格,以及有和没有"env"。

when I use the $ which ruby

Ruby在:/usr/bin/ruby

我还进入操作系统并将matz.rb文件的权限更改为所有用户的rwx,但没有任何效果。我做错了什么,还是我的系统设置不正确?

问题回答

/usr/bin/env 部分没问题。运行时需要给 bash 提供 matz.rb 的路径。如果你在包含 matz.rb 的目录中,输入 "./matz.rb"。"。" 表示当前目录 - bash 运行程序时默认不会在那里查找(就像 Windows 一样)。

env程序(/usr/bin/env)搜索可执行文件搜索路径 -PATH环境变量-以像在命令提示符下键入它一样搜索ruby程序,并运行该程序。 shebang注释不会这样做。如果您要将脚本交给可能没有在与您相同的位置安装ruby的其他人,则应使用“#!/usr/bin/env ruby”注释,以便只要他们可以通过键入“ruby”来运行它,它就可以工作。

如果您与matz.rb文件在同一目录中,请务必将其作为运行。

$ ./matz.rb

而且不仅仅是

$ matz.rb

这里有一个展示它有效的 shell 会话:

$ ls -la m*
-rwxr-xr-x  1 gareth  gareth  32  8 Jan 08:46 matz.rb
$ cat matz.rb
#!/usr/bin/env ruby
puts "Matz"
$ matz.rb
-bash: matz.rb: command not found
$ ./matz.rb
Matz

Your file wasn t created on Windows was it? If it has line endings, that will upset bash. You can open it with Vim and check:

vi matz.rb
:set ff=unix
:wq

如果您在使用Tab键自动完成"ff="部分时显示为dos,则它的文件格式错误。或者,运行dos2unix命令,然后再尝试运行该文件:

apt-get install sysutils
dos2unix matz.rb

听起来你在使用Unix / Linux系统,只是在命令行上键入matz.rb。如果您正在尝试执行当前目录中的命令,则需要像这样调用它:./matz.rb。 “./”告诉它查找当前目录,而不仅仅是/usr/bin和其他朋友。

我没有看到任何答案表明你需要改变文件的可执行模式,所以你可能想要尝试一下。

chmod +x matz.rb

在你去尝试做之前

./matz.rb

同样也许最好不要给这个文件附上.rb后缀,就像在常规的ruby/rails脚本中一样,例如script/generate,script/console等。

你可以在以下两个选项中使用 shebang 行:

#!/usr/bin/ruby
#!/usr/bin/env ruby

但是脚本需要可执行(您已经表示了),并且在您的shell $PATH中。

echo $PATH

将脚本放在这些目录之一,或者修改您的路径,否则请指定完整路径,例如:

export PATH=$PATH:/home/user/bin

或其中之一:

./matz.rb
/home/user/bin/matz.rb

你也可以将 Ruby 解释器作为参数运行脚本文件名,它将被执行。如果你在系统上安装了另一个版本的 Ruby(例如,用于测试,比如 Ruby Enterprise Edition,REE),这会非常有用。

/usr/bin/ruby matz.rb
/opt/ree/bin/ruby matz.rb

你尝试过使用以下ShaBang直接指向ruby吗?

#! /usr/bin/ruby

然后你可以在命令行中调用脚本。

./matz.rb

在Unix/Linux系统中,命令前的点用于在当前目录中搜索该命令。如果您提供类似于/usr/bin/ruby的路径,它将在当前目录中搜索名为usr的目录...

一条没有点号/的命令会在环境路径变量指定的位置进行搜索。

以/开头的指令将根据指定路径从根目录开始搜索。

在你的ShaBang中,你需要指定解释器的确切路径,因此 "/usr/bin/ruby" 是正确的路径。在命令行中,你需要使用 "./matz.rb" 调用脚本以执行它,否则 bash 将搜索一个像 /usr/bin/matz.rb 的命令,这会导致错误消息。





相关问题
热门标签