Подтвердите существование исполняемого файла (script, bat, cmd, exe) через файл ruby - PullRequest
3 голосов
/ 04 июня 2010

Используя файл ruby ​​(или любую другую утилиту rake), мне нужно выяснить, может ли пользователь, выполняющий мой скрипт, выполнять определенные команды оболочки. В частности, g ++ и т. Д. Надеемся, что это не зависит от системы, поэтому, если есть какой-то g ++. Bat, g ++. Exe или просто g ++ (и т. Д.), Он, тем не менее, должен сказать «да», если он находится на пути и исполняем в системе пользователей.

Пример: если у пользователя есть исполняемая версия файла без расширения и версия файла .cmd, он должен сказать «да» для версии без расширения в системе Linux и «да» для версии .cmd в системе Windows. Поскольку оболочка пользователя может выполнять только эту версию файла.

Цель этого состоит в том, чтобы позволить скрипту самоконфигурироваться (насколько это возможно).

Любые предложения о том, как я могу это сделать?

Ответы [ 3 ]

5 голосов
/ 04 июня 2010

Быстрый и грязный способ - просто попытаться выполнить g ++ с помощью команды system и проверить код возврата, например:

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

Чтобы избежать нежелательного вывода на консоль (например, перенаправление stdout / stderr на основе правильного синтаксиса ОС), вам нужно было бы сделать некоторые хитрости, но это не могло быть слишком плохо.

4 голосов
/ 04 июня 2010

Ну, File содержит как exists?, так и executable?. ENV['PATH'] получает каталоги, в которых находятся исполняемые файлы (по крайней мере, на * nix - кто-то может подтвердить для Windows?). Объедините эти два с небольшим количеством волшебства, и у вас должно быть решение.

Edit:

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
1 голос
/ 15 января 2015

Мне потребовалось что-то похожее (это исполняемый файл в пути) и я использовал системную команду, но проверил код ошибки возврата. в соответствии с этим это стандартный результат в unix (127 = файл не найден) stackoverflow стандартные коды возврата Unix

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

не могу сказать для Windows, однако

...