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

2024-01-21

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

例如:

$ cow moo

会采用一个带有ow命令脚本的cow gem,并在Ruby gem中执行“moo”函数。

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

$ cow -t moo

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

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


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

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

Cow.say ARGV.first

注意第一行,这是舍邦线 http://en.wikipedia.org/wiki/Shebang_%28Unix%29。它告诉您的 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 http://www.ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html,但也有许多宝石 https://www.ruby-toolbox.com/categories/CLI_Option_Parsers可用的。

我创建我自己的选项解析器,称为 Acclaim https://www.ruby-toolbox.com/projects/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 http://gembundler.com/通过自动将代码插入到加载路径中,使生活变得更轻松。您只需通过 Bundler 运行可执行文件即可:

$ bundle exec ./bin/cow moo
# output here...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建支持 Ruby 的 shell 命令? 的相关文章

  • 不同金额的 Stripe 订阅计划

    我正在为一家慈善机构制作一份捐赠表格 他们要求提供每月捐赠计划 用户可以选择他们想要捐赠的任何金额 我知道我可以制定个人计划 即 如果他们说每月捐款 5 美元 10 美元或 20 美元 我可以制定三个不同的计划并向用户订阅它们 有没有办法避
  • 如何从 Linux 命令行获取视频文件的分辨率(宽度和高度)?

    我一直在挖掘 mplayer mencoder 和 ffmpeg 文档 但我似乎无法想出anything 我对输出格式不是特别挑剔 因为我可以使用正则表达式将其拉出来 我只是似乎无法首先获取数据 Use ffprobe https ffmp
  • 使用 svn diff 时如何获取无上下文

    当我从命令行使用 svn diff 时 它会打印出已更改的行 以及前后 3 个未更改的行以获取上下文 我更喜欢只看到没有上下文的更改行 我无法确定任何命令行选项可以让我让它以这种方式运行 默认情况下 标准 diff 和 cvs diff 执
  • 类unix系统中的python和python3命令有什么区别?

    我通读了每个命令的描述 但每个命令的描述都是完全相同的 所以我不明白这两个命令在类 Unix 系统中的工作方式有何不同 谁能解释其中的区别吗 Python3命令的引入是因为python命令指向了python2 从那时起 Python3 已成
  • File.delete 上的 Ruby (Errno::EACCES)

    我试图在使用完一些 XML 文件后删除它们 其中一个文件给了我这个错误 delete Permission denied monthly builds xml Errno EACCES Ruby 声称该文件受到写保护 但我在尝试删除它之前设
  • 什么是“太聪明”的 Ruby 代码示例? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在与一些程序员朋友进行讨论 他们说他们看到 Ruby 程序员 尤其是 编写了很多 太聪明 的代码 所以我想知道那会是什么样子 我指
  • 如何在 Ruby 中列出局部变量?

    def method a 3 b 4 some method that gives a b end 局部变量 http ruby doc org core Kernel html method i local variables 它输出符号
  • 如何将两个不同的哈希数组中的值添加在一起?

    我有两个哈希数组 哈希值的键不同 player scores1 first name gt Bruce score gt 43 time gt 50 first name gt Clark score gt 45 minutes gt 20
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • 如何通过 shell 脚本确定网页是否存在?

    我正在尝试制作一个程序 可以将一系列漫画扫描转换为一个 pdf 文件 并且我不想尝试下载图片来确定我是否有正确的网址 是否有一个 shell 脚本命令可以用来检查网页是否存在 在 NIX 下 您可以使用curl发出一个简单的HEAD要求 H
  • 将“npm run start”的输出写入文件

    我想捕获的输出npm run start在一个文件中 我遇到了大量错误 我想更好地控制如何筛选输出 当我尝试时 npm run start gt log txt 我得到一个非常简短的文件 8 行 其结尾为 34m 39m 90m wdm 3
  • SSL_connect 返回=1 errno=0 状态=SSLv3 读取服务器证书 B:证书验证仅在代理时失败

    这篇文章几乎重复了许多其他帖子 包括Rails 4 和 Ruby 2 Net HTTP SSL 请求 OpenSSL SSL SSLError SSL connect returned 1 errno 0 state SSLv2 v3 re
  • 使用 Windows 命令行连接文本文件,删除前导行

    我需要连接一些相对较大的文本文件 并且更喜欢通过命令行来完成此操作 不幸的是我只有Windows 无法安装新软件 type file1 txt file2 txt gt out txt 允许我几乎得到我想要的 但我不希望 file2 txt
  • 红宝石边缘情况

    ruby 有一些边缘情况很难解释 因为解析会带来一些有趣的问题 我在这里列出其中两个 如果您知道更多 请添加到列表中 def foo 5 end this one works if tmp foo puts tmp to s end How
  • 如何在 Rails 控制器中调用通道方法?

    我有一个订阅用户的 ActionCable 方法 如果启动新的 convo 我也希望用户订阅新频道 我无法找出在控制器中调用通道方法的正确语法 更新 问题是消息在发送时附加到聊天框 但是当发送第一条消息时 Websocket 连接尚未建立
  • Ruby 中的并行赋值运算符

    我正在查看 Ruby 编程 书中的一个示例 def fib up to max i1 i2 1 1 parallel assignment i1 1 and i2 1 while i1 lt max yield i1 i1 i2 i2 i1
  • 捆绑安装无法从 https://rubygems.org/ 获取规格

    我正在尝试遵循 Hartl Rails 教程 但在使用捆绑器 gem 时遇到了问题 使用命令 bundle install 或 bundle update 时 我得到以下输出 从中获取源索引https rubygems org https
  • 可以覆盖/实现的 ruby​​ 运算符列表

    是否有可以覆盖的所有 ruby 运算符的列表 不是那些不能的 Here s Ruby 运算符表 http phrogz net programmingruby language html table 18 4 方法和可重载的有 Elemen
  • 在私有控制器方法中返回redirect_to

    前言 我正在使用设备进行身份验证 我试图阻止未经授权的用户查看 编辑或更新其他用户的信息 我最关心的是用户将 DOM 中的表单修改为另一个用户的 ID 填写表单 然后单击更新 我已经专门阅读过 像下面这样的东西应该有效 但事实并非如此 SO
  • Ruby 枚举器中的“break”与“raise StopIteration”

    如果我使用 Ruby Enumerators 来实现生成器和过滤器 generator Enumerator new do y x 0 loop do y lt lt x x 1 break if x gt CUTOFF end end l

随机推荐

  • javax.ejb.EJBException java.lang.IllegalStateException:无法检索 unitName 的 EntityManagerFactory

    我正在使用 EJB 开发 JavaEE 应用程序 我有一个名为Medico哪个代码是 Entity public class Medico implements Serializable private static final long
  • 为什么我不需要导出/导入 TypeScript 接口?

    我和我的同事一起创建了一个 Angular 5 应用程序 我为所有界面创建了一个文件夹 并按功能对它们进行分组 但是 我没有在它们上包含任何导出符号 并且在使用它们时 我永远不需要导入它们 它们只是存在并且不会产生任何编译错误 我喜欢这种方
  • “系统找不到文件 C:\ProgramData\Oracle\Java\javapath\java.exe”

    我在 Windows 8 上使用 JDK 8u25 并且 Java 安装遇到问题 我可以跑javac完全没问题 但是正在运行java产生此错误消息 The system cannot find the file C ProgramData
  • 在整个交易过程中始终使用“现在”的价值

    我正在寻找在整个交易中使用一致的当前日期和时间值的指南 我所说的事务大致指的是应用程序服务方法 此类方法通常执行单个 SQL 事务 至少在我的应用程序中是这样 环境背景 答案中描述的一种方法这个问题 https stackoverflow
  • Grails 客户端验证

    您 如果您 如何使用 grails 管理客户端验证 您使用插件还是使用 javascript 框架反映您的约束 干杯 我个人没有使用过它们 但这两个插件可能会对您有所帮助 http grails org plugin javascript
  • 需要下一状态传播进行反向传播的神经网络强化学习

    我正在尝试构建一个包含卷积和 LSTM 使用 Torch 库 的神经网络 以通过 Q 学习或优势学习进行训练 这两者都需要在更新状态 T 的权重之前通过网络传播状态 T 1 必须进行额外的传播会降低性能 这很糟糕 但不是too坏的 然而 问
  • 优化 MySQL 导入(将详细 SQL 转储转换为快速 SQL 转储/使用扩展插入)

    我们正在使用 mysqldump 和选项 complete insert skip extended insert创建保存在 VCS 中的数据库转储 我们使用这些选项 和 VCS 可以轻松比较不同的数据库版本 现在导入转储需要相当长的时间
  • 德尔福和 i18n

    Delphi 是否以任何方式支持国际化 我已经看到我可以为项目添加不同的语言 但这似乎会创建 dfm 文件的多个实例 因此 语言不能在运行时更改 我说得对吗 您如何处理国际化 如果您这样做 有没有最佳实践 Delphi 附带了一些工具来执行
  • jQuery 发布请求(不是 AJAX)

    在 ASP NET MVC 应用程序中 我使用 jQuery 在按钮单击时发布数据
  • 当弹出窗口打开时禁用后台的所有内容

    我正在开发一个基于 HTML JQuery 和 CSS 的网页 我想在其中使用简单的 div 标签打开弹出窗口 我想在弹出窗口打开时禁用后台的所有内容 这意味着虽然弹出 div 对用户可见 但他或她不应该能够单击网页上的任何其他内容 弹出窗
  • 画布中的鼠标偏移 [fabric.js]

    我已经阅读了 3 5 个关于鼠标偏移的主题 但我仍然不明白哪里混乱了 就我而言 60 时一切正常 另外40 的鼠标是偏移的 有时对象位置与鼠标行为无关 IE 和 Chrome 是最混乱的 我尝试编辑样式表和父 div 但没有任何结果 最糟糕
  • 对象没有 hasOwnProperty 方法(即未定义)- IE8

    这看起来很奇怪 这是我在IE8控制台中的实验 typeof obj1 object obj1 hasOwnProperty typeof obj2 object obj2 hasOwnProperty undefined 关于什么可能导致这
  • 向 App Store 提交 iPhone 应用程序的流程? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 是否需要先支付 99 美元才能观看视频以向 App Store 提交 iPhone 应用程序 还是可以在任何地方免费获得 您可以加入开发者计划并免费观
  • Python正则表达式在集合内匹配

    测试时http gskinner com RegExr http gskinner com RegExr 在线正则表达式测试器 正则表达式 jpg bmp 当 jpg 或 bmp 存在时返回结果 但是 当我在 python 中运行此正则表达
  • SSRS 2005 缺少 Microsoft.ReportingServices.Interfaces.dll

    我在 c program files SQL Server 90 Tools Binn 中缺少此 DLL 引用 我假设这是因为我没有安装 2005 客户端 我安装了 2005 年的所有服务 数据库实例 报告服务实例 SSAS 和 SSIS
  • 持续更新文件

    最终 我需要将 Spotify API 中的信息提供给应用程序 以显示 当前歌曲 信息 包括提示时间 因此需要不断轮询 API 并更新应用程序轮询的数据源 我仍在尝试从流而不是文件的角度来思考数据 所以我想出了这个小实验来了解如何不断更新文
  • PM2 - 语法错误:严格模式之外尚不支持块范围声明

    我目前正在 Ubuntu 服务器上安装 NodeJS 服务 该应用程序是用 CoffeeScript 编写的 并且可以自行运行良好 这就是我设置项目的方式 cd test project nvm use v4 9 1 npm install
  • Zeroinfl“系统在计算上是奇异的”,而预测变量没有相关性

    我正在尝试对一年中工人缺勤天数的计数数据 因变量 进行建模 我有一组预测变量 包括有关工人 有关他们的工作等的信息 其中大多数是分类变量 因此 需要估计大量系数 83 但由于我有超过 600 000 行 我认为这应该不会有问题 此外 我的数
  • 当你调用一个包含yield的函数时会发生什么?

    I read here https stackoverflow com questions 19302530 python generator send function purpose 60042174 noredirect 1 comm
  • 如何创建支持 Ruby 的 shell 命令?

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