如何将Ruby脚本转换为Bash命令?

7
我有一个Ruby文件,我通过ruby file.rb "parameters"来运行它。我希望每次运行时只需要输入 regtask parameters 而无需加上ruby和文件名。我想让它和ls命令一样方便。应该怎么做呢?

您可以重命名文件并删除.rb扩展名,以使文件名更易于键入,但无法摆脱键入文件名。您仍需要将其作为命令名称键入(而不是ruby命令的参数)。 - sawa
2个回答

15

编辑您的文件,确保这是第一行,这样您的系统就知道如何执行您的文件:

#!/usr/bin/env ruby

接下来,更改文件权限以使其可执行:

chmod a+x file.rb

最后,将其重命名并移动到某个地方,以便在不必编写完整路径的情况下执行它:
mkdir -p ~/bin
mv file.rb ~/bin/regtask

(大多数系统会自动将~/bin添加到PATH中,如果它存在;如果不存在,则需要在启动文件中手动将其添加到PATH中。)

如果您使用的是Windows编辑器,则需要修复行尾。更好的做法是停止使用Windows编辑器,或者找到一个可以充分控制行尾的编辑器。Unix文本文件仅具有LF行尾,而Windows上的标准是CRLF。 - tripleee
看,这就是让我困惑的地方。我不能只将它添加到我的 /use/local/bin 中,而不是在我的主目录中创建一个 bin 并在启动时包含它吗?哪种做法更好?为什么要使用主目录? - Doug Smith
~/bin 是你的。/usr/local/bin 是为所有用户准备的。两个选项都可以工作,但它们执行不同的任务。 - Amadan

5

这应该会有所帮助... 如果你遇到任何问题,请告诉我。

http://commandercoriander.net/blog/2013/02/16/making-a-ruby-script-executable/

将 Ruby 脚本变成可执行文件

对于 *nix 社区来说,这是常识,但对于许多新开发人员来说,将 Ruby 脚本变成可执行的命令行程序就像魔术一样。虽然互联网上有其他参考资料,但在这篇文章中,我将简要解释如何从直接调用 Ruby 运行 Ruby 脚本,到只需脚本名即可运行脚本。

我们假设有一个简单的 Ruby 脚本,它在命令行上打印 "hello"。我们的脚本名为 greeter.rb。该文件包含一行 Ruby 代码:

puts "Hello!"`

要运行这个脚本,我们必须输入 ruby greeter.rb。如果只需输入 greeter 即可运行该脚本,那不是很好吗?是的,很好。
首先,我们需要告诉 Bash 对于我们的文件应该怎么做,因为我们不会直接将脚本传递给 Ruby。为了做到这一点,在我们的脚本最顶部添加以下内容:
#!/usr/bin/env ruby
puts "Hello!"

第一行是Bash指令,基本上告诉Bash使用env命令指定的当前配置版本的Ruby运行我们的文件。想要了解env如何工作,请在命令行中输入man env
其次,我们需要使脚本可执行,这需要更改文件权限。如果文件权限的概念是新的,请在此处阅读相关信息。基本上,文件有三种类型的权限:读、写和执行。大多数文件通常只具有读取和写入访问权限。由于我们想要执行我们的脚本,我们将不得不授予它执行权限。
这只是一个简单的Bash命令。在命令行上,导航到保存greeter.rb文件的目录。现在,要检查权限,请运行:
ls -l greeter.rb

输出结果将如下所示:
-rw-r--r--    1 username  staff   13 Feb 16  21:10 greeter.rb

您自己的用户名将显示在username的位置,创建日期将自然不同,但除此之外输出几乎相同。该行的第一部分是相关部分。字母rw指定了读取和写入权限。

我们要添加执行权限,它将出现在该行中的一个x上。要添加执行权限,请运行以下命令。

chmod 755 greeter.rb

现在,如果您使用ls -l greeter.rb再次检查文件权限,输出应该有所不同。
-rwxr-xr-x  1 username  staff     13 Feb 16 21:20 greeter.rb

x的存在表示该文件可以直接运行,无需先调用Ruby。下面的命令应该能让我们的文件输出"hello"。

./greeter.rb

就快完成了。现在,我们只需要去掉前缀./,这告诉Bash在哪里查找greeter.rb,也就是在当前目录中。在完成最后一步之前,让我们将文件重命名为greeter

mv greeter.rb greeter

现在,最后一步。每次我们调用一个Bash程序,比如lschmodmv等,Bash都会在预定义的文件夹列表中搜索这些程序。这被称为路径。要查看您计算机上设置的路径,请尝试:
echo "$PATH"

输出应该是各种系统关键文件夹的长字符串。我们需要将我们的应用程序放到其中一个文件夹中。传统上,最好不要动/usr/bin//bin/这样的文件夹。相反,任何类型的用户添加都应该放在/usr/local/bin/中。如果该文件夹不存在,请使用以下命令创建:

mkdir -p /usr/local/bin/

现在,我们可以将我们的问候语程序移动到那个文件夹中,或者将应用程序留在原地,只需在 /usr/local/bin/ 文件夹中创建一个软链接(或者在 OS X 中称为别名)。要创建别名,我们将使用 ln 命令。从 greeter 存放的目录中,键入以下内容: ln -s $PWD/greeter /usr/local/bin/ 请注意,$PWD 变量将扩展为我们问候语脚本的绝对路径。现在,我们完成了,可以简单地输入 greeter 来调用我们的 Ruby 脚本!
作为脚注,如果上述任何 Bash 命令似乎令人困惑,请尝试通过键入 man <command> 查找其 man 页面。

2
ln 命令不会创建别名,它会在 OS X 上创建软链接或硬链接。如果你想要创建 Mac OS 别名,需要使用 Finder 的 Option-drag(或使用 osascript 模拟该操作)。具体方法可以参考这个链接:https://dev59.com/sWw05IYBdhLWcg3wuUAL - Amadan
我没有意识到这一点...谢谢你提醒我! - contact411

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接