我在开发一个似乎只在Ubuntu上发生的宝石时遇到了一个有趣的问题。我的Ruby是使用rbenv工具安装的2.2.2版。我正在构建一个CLI(工具A),它取决于计算机上安装的另一个实用程序(工具B)。在调用工具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上的任何实用程序时,这似乎发生了。我已经将程序更改为使用system("which tool-b")
而不是hash
,但我仍然有兴趣知道我的设置是否有特定内容可能正在执行此操作(它是Amazon EC2上的一个普通的Ubuntu 14.04框,几乎没有什么,只有rbenv,Ruby 2.2.2和我的宝石),或者我不了解的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
答案 0 :(得分:1)
Kernel#system
使用系统shell,即/bin/sh
来执行。 hash
仅添加到POSIX.2013中的基本系统,在此之前,它是可选的。我相信dash
,Ubuntu使用的默认系统shell还不符合POSIX.2013,因此没有hash
(还)。
macOS / OSX使用Bash作为系统shell, 拥有hash
。