【发布时间】:2016-11-24 03:32:54
【问题描述】:
我在开发一个似乎只发生在 Ubuntu 上的 gem 时遇到了一个有趣的问题。我的 Ruby 是使用 rbenv 工具安装的 2.2.2 版。我正在构建一个依赖于机器上安装的另一个实用程序(工具 B)的 CLI(工具 A)。在调用工具 B 时,如果未找到工具 B,则会有一个保护子句打印错误消息,如下所示:
fail "Can't do it: missing 'Tool B' utility" unless system("hash tool-b")
我在 OSX 上对此没有任何问题,但在 Ubuntu 上 system("hash tool-b") 总是返回 nil(命令失败)。从 Ruby 解释器 ($?) 中打印退出代码时,我得到 127 而不是 0。
奇怪的是,如果我直接从命令行运行hash tool-b,进程成功退出,状态为0。在使用system("hash <utility>") 在 Ruby 中检查 Ubuntu 上的 any 实用程序时,这似乎发生在我身上。我已将程序更改为使用system("which tool-b") 而不是hash,但我仍然想知道我的设置是否有一些特殊的东西可能会这样做(它是 Amazon EC2 上的一个香草 Ubuntu 14.04 盒子,几乎什么都没有rbenv、Ruby 2.2.2 和我的 gem),或者我不明白的关于 Ubuntu + Ruby 的东西。
我在不同平台上运行的命令总结:
fail "Can't create cartridge: missing 'cartridge' utility" unless system("hash cartridge") # offending Ruby code
### UBUNTU COMMAND LINE
$ hash cartridge
$ echo $?
=> 0
### UBUNTU IRB
system("hash cartridge")
=> nil
puts $?
=> ... exit 127
### OSX IRB
system("hash cartridge")
=> true
puts $?
=> ... exit 0
【问题讨论】:
标签: ruby linux ubuntu rubygems