通过ruby文件确认可执行文件(script,bat,cmd,exe)的存在

时间:2010-06-03 21:38:52

标签: ruby rake rakefile

使用ruby文件(或任何rake工具)我需要查明执行我的脚本的用户是否能够执行某些shell命令。特别是g ++等。希望系统独立,所以如果有一些g ++。bat,g ++。exe或者只是g ++(等等)它应该说是的,只要它在用户系统的路径和可执行文件上。

示例:如果用户具有该文件的无扩展可执行版本和该文件的.cmd版本,则对于Linux系统上的无扩展版本应该为“是”,对于.cmd版本应为“是”在Windows系统上。由于用户shell只能执行该版本的文件。

这样做的目的是允许脚本自我配置(尽可能多)。

关于我如何做到这一点的任何建议?

3 个答案:

答案 0 :(得分:5)

快速而简单的方法是简单地尝试通过system命令执行g ++并检查返回码,例如:

def gpp_exists
  return system("g++ --version")
end

你必须做一些技巧以避免在控制台上获得不需要的输出(例如,根据正确的操作系统语法重定向stdout / stderr),但这不会太糟糕。

答案 1 :(得分:4)

好吧,File同时包含exists?executable?ENV['PATH']获取可执行文件所在的目录(至少在* nix上 - 有人可以确认Windows吗?)。将两者结合起来有点神奇,你应该有一个解决方案。

编辑:

irb(main):001:0> ENV['PATH'].split(':').collect {|d| Dir.entries d if Dir.exists? d}.flatten.include? 'adduser'
=> true
irb(main):002:0> ENV['PATH'].split(':').collect {|d| Dir.entries d if Dir.exists? d}.flatten.include? 'foo'
=> false

答案 2 :(得分:1)

我需要类似的东西(在路径中是可执行的)并使用系统命令但检查返回的错误代码。根据这个,它是unix中的标准结果(127 =找不到文件)stackoverflow standard unix return codes

    def checkinstalled(program)
      stdop=system(program)
      result=$?
      exit_code=result.exitstatus 
      return !exit_code.eql?(127)
    end

不能说窗户