3

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

示例:如果用户有文件的无扩展可执行版本和文件的 .cmd 版本,它应该在 linux 系统上对无扩展版本说“yes”,在 windows 上对 .cmd 版本说“yes”系统。由于用户 shell 只能执行该版本的文件。

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

关于我如何去做这件事的任何建议?

4

3 回答 3

5

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

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

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

于 2010-06-03T22:00:55.050 回答
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
于 2010-06-03T21:57:28.490 回答
1

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

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

但是不能说适用于窗户

于 2015-01-15T08:39:55.843 回答