Ubuntu:运行Unix“hash”命令时,内核#系统失败(返回nil)

时间:2016-07-20 19:14:36

标签: ruby linux ubuntu rubygems

我在开发一个似乎只在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

1 个答案:

答案 0 :(得分:1)

Kernel#system使用系统shell,即/bin/sh来执行。 hash仅添加到POSIX.2013中的基本系统,在此之前,它是可选的。我相信dash,Ubuntu使用的默认系统shell还不符合POSIX.2013,因此没有hash(还)。

macOS / OSX使用Bash作为系统shell, 拥有hash