首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >"which in ruby":检查来自ruby的程序是否存在于$PATH中

"which in ruby":检查来自ruby的程序是否存在于$PATH中
EN

Stack Overflow用户
提问于 2010-01-21 19:18:41
回答 14查看 25.7K关注 0票数 80

我的脚本很大程度上依赖于外部程序和脚本。我需要确保我需要调用的程序存在。手动地,我会在命令行中使用'which‘来检查它。

$PATH中有没有等同于File.exists?的东西

(是的,我想我可以解析%x[which scriptINeedToRun],但这并不是非常优雅。

谢谢!yannick

更新:以下是我保留的解决方案:

代码语言:javascript
复制
 def command?(command)
       system("which #{ command} > /dev/null 2>&1")
 end

更新2:一些新的答案出现了-至少其中一些提供了更好的解决方案。

更新3:ptools gem向File类添加了一个"which“方法。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2011-03-29 18:23:16

真正的跨平台解决方案,在Windows上正常工作:

代码语言:javascript
复制
# Cross-platform way of finding an executable in the $PATH.
#
#   which('ruby') #=> /usr/bin/ruby
def which(cmd)
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
    exts.each do |ext|
      exe = File.join(path, "#{cmd}#{ext}")
      return exe if File.executable?(exe) && !File.directory?(exe)
    end
  end
  nil
end

这不使用主机操作系统嗅探,并尊重$PATHEXT,它列出了Windows上可执行文件的有效文件扩展名。

which可以在许多系统上运行,但不是所有系统都可以运行。

票数 127
EN

Stack Overflow用户

发布于 2013-11-13 04:07:04

使用stdlib附带的mkmf中的find_executable方法。

代码语言:javascript
复制
require 'mkmf'

find_executable 'ruby'
#=> "/Users/narkoz/.rvm/rubies/ruby-2.0.0-p0/bin/ruby"

find_executable 'which-ruby'
#=> nil
票数 82
EN

Stack Overflow用户

发布于 2010-07-30 02:58:41

代码语言:javascript
复制
def command?(name)
  `which #{name}`
  $?.success?
end

最初取自hub,它使用type -t而不是which (对于我来说,这对zsh和bash都是失败的)。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2108727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档