使用ruby文件(或任何rake工具)我需要查明执行我的脚本的用户是否能够执行某些shell命令。特别是g ++等。希望系统独立,所以如果有一些g ++。bat,g ++。exe或者只是g ++(等等)它应该说是的,只要它在用户系统的路径和可执行文件上。
示例:如果用户具有该文件的无扩展可执行版本和该文件的.cmd版本,则对于Linux系统上的无扩展版本应该为“是”,对于.cmd版本应为“是”在Windows系统上。由于用户shell只能执行该版本的文件。
这样做的目的是允许脚本自我配置(尽可能多)。
关于我如何做到这一点的任何建议?
答案 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
不能说窗户