“который в рубине”: Проверка, если программа существует в $PATH от рубина

мои сценарии полагаются в большой степени на внешние программы и сценарии. Я должен быть уверен, что существует программа, которую я должен назвать. Вручную, я проверил бы это использование 'который' в командную строку.

Есть ли эквивалент File.exists? для вещей в $PATH?

(да я предполагаю, что мог проанализировать %x[which scriptINeedToRun] но это не супер изящно.

Спасибо! yannick


ОБНОВЛЕНИЕ: вот решение, которое я сохранил:

 def command?(command)
       system("which #{ command} > /dev/null 2>&1")
 end

ОБНОВЛЕНИЕ 2: Несколько новых ответов вошли - по крайней мере некоторые из них предлагают лучшие решения.

Обновление 3: ptools драгоценный камень имеет, добавляет "который" метод к классу Файла.

75
задан Yannick Wurm 9 February 2014 в 12:23
поделиться

7 ответов

Не столько элегантно, но это работает :).

def cmdExists?(c)
  system(c + " > /dev/null")
  return false if $?.exitstatus == 127
  true
end

Предупреждение : Это не Рекомендуется, Опасно Советы!

-7
ответ дан 24 November 2019 в 11:28
поделиться

Был назван драгоценность , который_Ruby , который был чистым руб. Это больше не доступно.

Однако я нашел это чистобируемая альтернативная реализация .

2
ответ дан 24 November 2019 в 11:28
поделиться

Вы можете получить доступ к переменным системной среды с Env Hash:

puts ENV['PATH']

Это вернет путь в вашу систему. Так что, если вы хотите знать, существует ли программа , вы можете сделать это:

ENV['PATH'].split(':').each {|folder| puts File.exists?(folder+'/nmap')}

Это будет печать true , если файл был найден или false иначе.

5
ответ дан 24 November 2019 в 11:28
поделиться

Это доработка ответа rogeriopvl, делающая его кроссплатформенным:

require 'rbconfig'

def is_windows?
  Config::CONFIG["host_os"] =~ /mswin|mingw/
end

def exists_in_path?(file)
  entries = ENV['PATH'].split(is_windows? ? ";" : ":")
  entries.any? {|f| File.exists?("#{f}/#{file}")}
end
0
ответ дан 24 November 2019 в 11:28
поделиться
def command?(name)
  `which #{name}`
  $?.success?
end

Изначально взято из hub, где использовался type -t вместо which, хотя (и что не удалось для zsh и bash для меня).

16
ответ дан 24 November 2019 в 11:28
поделиться

Вот что я использую. Это не зависит от платформы ( File :: PATH_SEPARATOR is ":" в Unix и ";" в Windows), ищет только программные файлы, которые на самом деле являются исполняемыми. действующим пользователем текущего процесса и завершается, как только программа будет найдена:

##
# Returns +true+ if the +program+ executable is found in the user's path.
def has_program?(program)
  ENV['PATH'].split(File::PATH_SEPARATOR).any? do |directory|
    File.executable?(File.join(directory, program.to_s))
  end
end
3
ответ дан 24 November 2019 в 11:28
поделиться

Я хотел бы добавить, что which принимает флаг -s для тихого режима, который устанавливает только флаг успеха, устраняя необходимость перенаправления вывода.

2
ответ дан 24 November 2019 в 11:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: