ruby - 如何创建支持 Ruby 的 shell 命令?

标签 ruby shell command-line command

我正在创建一个 gem,我希望能够在其中使 shell 命令执行 gem 中的功能。在更简单的上下文中,我需要创建一个 shell 脚本,该脚本在触发 shell 命令时执行带选项的 Ruby 函数。最简单的方法是什么?

例如:

$ cow moo

将使用带有 cow 命令脚本的 cow gem,并在 Ruby gem 中执行“moo”功能。

如果可以的话,我还希望在 shell 中支持常见的“选项”格式:

$ cow -t moo

上面的例子会采用一个选项并在 Ruby 中应用一个脚本来处理它(在这个例子中 -t 会打印两次 'moo')。

如果有人可以帮助我们解决这个问题,那将是一个很大的帮助。谢谢!

最佳答案

您可以创建一个名为 cow 的常规可执行 Ruby 文件,其中包含:

#!/usr/bin/env ruby
require 'cow'

Cow.say ARGV.first

注意第一行,即 shebang line .它告诉您的 shell 使用哪个程序来解释脚本。这允许用户简单地调用 cow 而不是 ruby $(which cow)

将您的脚本放在bin 目录中:

cow/
  bin/
    cow  <- your executable file
  lib/
    cow.rb
    cow/
      say.rb
  cow.gemspec

现在,您需要做的就是将其放入您的 gem 规范中:

Gem::Specification.new 'cow' do |gem|
  gem.executables = %w(bin/cow)
end

在安装过程中,Rubygems 会将您的 gem 二进制文件安装在用户路径中的某处,确保可以找到它们。

关于选项解析,标准库包括optparse , 但也有 many gems可用。

我创建了 my own option parser, called Acclaim ,我在自己的实用程序中使用它。这是一个示例:

class Cow::Command < Acclaim::Command
  option :all_caps, '-A', '--all-caps'

  when_called do |options, args|
    text = args.first.to_s
    text.upcase! if options.all_caps?
    Cow.say text
  end
end

为了测试您的应用程序,您可以简单地执行您的脚本:

$ pwd
~/projects/cow
$ ./bin/cow moo
# output here...

但是,这需要您根据规范构建您的 gem,并在每次您想要测试您的更改时将其安装在本地:

ruby -I ./lib -r cow -e 'puts Cow.version'
0.0.1
gem build cow.gemspec && gem install cow-0.0.1.gem

Bundler通过自动将代码插入加载路径让生活更轻松。您只需通过 Bundler 运行您的可执行文件:

$ bundle exec ./bin/cow moo
# output here...

关于ruby - 如何创建支持 Ruby 的 shell 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9710337/

相关文章:

ruby-on-rails - 管理 Rails 的 gem 版本/依赖项

ruby - 自动测试、RSpec 2 和 Ruby 1.9.2-p0 - 完全没有输出

linux - 如何在 bash shell 脚本中使用 sed 和 egrep

c - 为什么 less 改变输出顺序?

shell - UNIX 排序命令如何对非常大的文件进行排序?

ios - 为什么在从命令行创建 IPA 时我的构建阶段脚本不被执行?

c# - 在控制台应用程序中,防止命令行参数中的特殊序列被转义的最佳方法是什么?

ruby-on-rails - Rails.application.credentials.dig 不工作

regex - 我怎样才能找到匹配特定次数的模式?

css - 在 SASS/Compass 输出前添加注释