我的脚本很大程度上依赖于外部程序和脚本。我需要确保我需要调用的程序存在。手动地,我会在命令行中使用'which‘来检查它。
在$PATH
中有没有等同于File.exists?
的东西
(是的,我想我可以解析%x[which scriptINeedToRun]
,但这并不是非常优雅。
谢谢!yannick
更新:以下是我保留的解决方案:
def command?(command)
system("which #{ command} > /dev/null 2>&1")
end
更新2:一些新的答案出现了-至少其中一些提供了更好的解决方案。
更新3:ptools gem向File类添加了一个"which“方法。
发布于 2011-03-29 18:23:16
真正的跨平台解决方案,在Windows上正常工作:
# 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
可以在许多系统上运行,但不是所有系统都可以运行。
发布于 2013-11-13 04:07:04
使用stdlib附带的mkmf
中的find_executable
方法。
require 'mkmf'
find_executable 'ruby'
#=> "/Users/narkoz/.rvm/rubies/ruby-2.0.0-p0/bin/ruby"
find_executable 'which-ruby'
#=> nil
发布于 2010-07-30 02:58:41
def command?(name)
`which #{name}`
$?.success?
end
最初取自hub,它使用type -t
而不是which
(对于我来说,这对zsh和bash都是失败的)。
https://stackoverflow.com/questions/2108727
复制相似问题