我正在尝试制作命令行工具。我已经有一个ruby脚本(一个文件)。但我想将它作为普通的命令行命令。
现在我必须进入脚本所在的目录并键入ruby script.rb才能使其正常运行,但我想从目录中创建一个命令,如脚本[option],它应该处理所需的选项。脚本。
我需要为此制作独立的红宝石宝石吗?我读过一些像托尔和指挥官这样的宝石,但我无法正常使用它们。
如何制作此命令行工具?
PS:一个例子可以是twitter gem和命令行工具't',它也是一个gem。
答案 0 :(得分:2)
Ruby,因为它是一种通用编程语言,因此可以轻松创建命令行脚本。这是您可以构建的基本脚本:
#!/usr/bin/env ruby
require 'optparse'
args = {}
OptionParser.new do |opt|
opt.on('-i', '--input FILE', 'File to read') { |o| args[:file_in] = o }
opt.on('-o', '--output FILE', 'File to write') { |o| args[:file_out] = o }
end.parse!
abort "Missing input or output file" unless (args[:file_in] && args[:file_out])
File.write(args[:file_out], File.read(args[:file_in]))
这里发生了什么:
#!/usr/bin/env ruby
通常被称为" bang line"。 shell将在文件顶部查找此行,以确定哪个应用程序可以读取文件并执行/解释它。 env
是一个应用程序,它将查看用户的PATH环境变量,并返回第一个发现为Ruby的Ruby来执行脚本。使用此命令可使脚本在正常的/ usr / bin,/ usr / local / bin中使用Rubies,或者在由rbenv或RVM管理时使用。require 'opt parse'
引入了Ruby的命令行解析器类OptionParser,这样可以轻松设置传统标志,例如-i path/to/file/to/read
,-o path/to/file/to/write
,或长参数,例如--input
或--output
。它还会自动提供-h
和--help
标志,以返回脚本的格式化帮助文本。 OptionParser有点学习曲线,因此请使用complete example进行操作,然后您就可以了解它。其余的应该是不言自明的。
传统上,系统安装的可执行文件都在/usr/bin
。我们编写或添加的可执行文件都在/usr/local/bin
,我强烈建议坚持使用。
某些操作系统不会自动为PATH中的/ usr / local / bin提供条目,因此您可能需要修改〜/ .bashrc,〜/ .bash_profile或〜/ .profile中的PATH设置允许shell找到脚本。
可执行脚本需要设置其可执行标志:chmod +x /path/to/executable
是基本命令。有关详细信息,请参阅man chmod
。
我倾向于将脚本的扩展名留在原地; Ruby脚本是" foo.rb",Python是" bar.py"等我这样做是因为我更喜欢将该扩展名作为它的语言提示写的,但是YMMV。扩展是不必要的,所以请选择适合您的方式。
除此之外,您可能希望提供日志记录输出或输出到系统的syslog。在第一种情况下,使用Ruby的内置Logger类,或者在第二种情况下使用Syslog类。
答案 1 :(得分:2)
实际上,Ruby中的命令行应用程序有两个很棒的宝石。
首先是methadone,它适用于更简单的命令行应用程序。
另一个是gli,适用于具有多个命令的应用,例如bundler。
如果您想了解更多信息,可以查看有关使用这些宝石的作者创建命令行应用在ruby中构建强大的命令行应用的书籍。
答案 2 :(得分:0)
你不需要把它变成一个宝石,以下就足够了:
script.rb
更改为script
#!/usr/bin/env ruby
添加为script
$HOME/bin
,确保它在PATH中),或者通过明确地提供路径来执行,例如$HOME/myscriptdir/script