【问题标题】:Ubuntu: Kernel#system fails (returns nil) when running the Unix "hash" commandUbuntu:运行 Unix“hash”命令时内核#system 失败(返回 nil)
【发布时间】: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


    【解决方案1】:

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

    macOS / OSX 使用 Bash 作为其系统外壳,确实有hash。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-13
      • 2020-10-17
      • 2014-08-07
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多