мои сценарии полагаются в большой степени на внешние программы и сценарии. Я должен быть уверен, что существует программа, которую я должен назвать. Вручную, я проверил бы это использование 'который' в командную строку.
Есть ли эквивалент File.exists?
для вещей в $PATH
?
(да я предполагаю, что мог проанализировать %x[which scriptINeedToRun]
но это не супер изящно.
Спасибо! yannick
ОБНОВЛЕНИЕ: вот решение, которое я сохранил:
def command?(command)
system("which #{ command} > /dev/null 2>&1")
end
Не столько элегантно, но это работает :).
def cmdExists?(c)
system(c + " > /dev/null")
return false if $?.exitstatus == 127
true
end
Предупреждение : Это не Рекомендуется, Опасно Советы!
Был назван драгоценность , который_Ruby
, который был чистым руб.
Это больше не доступно.
Однако я нашел это чистобируемая альтернативная реализация .
Вы можете получить доступ к переменным системной среды с Env Hash:
puts ENV['PATH']
Это вернет путь в вашу систему. Так что, если вы хотите знать, существует ли программа
, вы можете сделать это:
ENV['PATH'].split(':').each {|folder| puts File.exists?(folder+'/nmap')}
Это будет печать true
, если файл был найден или false
иначе.
Это доработка ответа 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
def command?(name)
`which #{name}`
$?.success?
end
Изначально взято из hub, где использовался type -t
вместо which
, хотя (и что не удалось для zsh и bash для меня).
Вот что я использую. Это не зависит от платформы ( 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
Я хотел бы добавить, что which
принимает флаг -s
для тихого режима, который устанавливает только флаг успеха, устраняя необходимость перенаправления вывода.