【发布时间】:2011-01-04 19:21:43
【问题描述】:
这就是我在 ruby 中检测 git 的方式:
`which git 2>/dev/null` and $?.success?
但是,这不是跨平台的。它在非 unix 系统或没有 which 命令的系统上失败(尽管我不确定它们是什么)。
我需要一种方法来检测满足这些条件的 git:
- 即使在 Windows 上也能可靠地跨平台运行
- 不向 $stdout 或 $stderr 输出任何内容
- 少量代码
更新:解决方案是完全避免使用which,并将输出重定向到Windows 上的NUL。
require 'rbconfig'
void = RbConfig::CONFIG['host_os'] =~ /msdos|mswin|djgpp|mingw/ ? 'NUL' : '/dev/null'
system "git --version >>#{void} 2>&1"
system 命令在成功时返回 true,在失败时返回 false,从而为我们节省了使用反引号时需要的 $?.success?。
【问题讨论】:
-
原谅我潜在的愚蠢,但
which不会写入标准输出吗? -
@Steven:当然可以,但是在它自己的子shell中,您可以看到我使用了反引号,它在返回值中捕获了该输出,然后我将其丢弃。如果
which向 STDERR 写了一些东西,ruby 会将其转发给主程序的 $stderr(我不希望发生这种情况),所以我使用2>/dev/null来处理它。 -
@mislav: 恐怕我对你使用的技术不熟悉,但如果你可以同时拦截 stdout 和 stderr,你就可以避免依赖
which,直接运行@ 987654334@ 代替。我怀疑我离我很远...... -
关于 RUBY_PLATFORM 的一点是它不能正确检测 Java。看到这个帖子:blog.emptyway.com/2009/11/03/…
标签: ruby windows git shell detect