Confirmar la existencia de ejecutable (script, bat, cmd, exe) a través de un archivo ruby

StackOverflow https://stackoverflow.com/questions/2969967

  •  24-10-2019
  •  | 
  •  

Pregunta

Usando un archivo Ruby (o cualquier instalación de rastrillo) necesito averiguar si el usuario que ejecuta mi script puede ejecutar ciertos comandos de shell. En particular, G ++, etc., con suerte, el sistema independiente, por lo que si hay algunos G ++. BAT, G ++. Exe o simplemente G ++ (etc.) debería decir que sí, sin embargo, siempre que esté en la ruta y ejecutable en el sistema de usuarios.

Ejemplo: si el usuario tiene una versión ejecutable sin extensión del archivo y una versión .cmd del archivo, debería decir "sí" para la versión sin extensión en un sistema Linux y "sí" a la versión .cmd en un Windows sistema. Dado que los usuarios de Shell solo pueden ejecutar esa versión del archivo.

El propósito de esto es permitir que el script sea autoconfigurante (tanto como sea posible).

¿Alguna sugerencia sobre cómo podría hacer esto?

¿Fue útil?

Solución

Una forma rápida y sucia es simplemente intentar ejecutar G ++ a través del system comando y verifique el código de retorno, por ejemplo:

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

Tendría que hacer algunos trucos para evitar obtener una salida no deseada en la consola (por ejemplo, redirigir STDOUT/STDERR basado en la sintaxis del sistema operativo correcto), pero no podría ser tan malo.

Otros consejos

Bien, File contiene ambos exists? y executable?. ENV['PATH'] Obtiene los directorios que los ejecutables están adentro (al menos en *nix - ¿Alguien puede confirmar por Windows?). Combine los dos con un poco de magia y deberías tener una solución.

Editar:

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

He requerido algo similar (es ejecutable en la ruta) y use el comando del sistema, pero verifique el código de error de retorno. De acuerdo con esto, es un resultado estándar en UNIX (127 = archivo no encontrado) Códigos de retorno de UNIX estándar de StackOverflow

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

Sin embargo, no puedo decir para Windows

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top