80 votes

"ce qui en ruby": Vérifier si le programme existe dans $PATH de ruby

mes scripts s'appuient fortement sur externe des programmes et de scripts. J'ai besoin d'être certain qu'un programme j'ai besoin de d'appel. Manuellement, j'aimerais vérifier cela en utilisant " qui " dans la ligne de commande.

Est-il équivalent à File.exists? pour les choses en $PATH?

(oui, je suppose que j'ai pu analyser %x[which scriptINeedToRun] mais c'est pas super élégant.

Merci! yannick


Mise à JOUR: Voici la solution que j'ai retenu:

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

Mise à JOUR 2: UN peu de nouvelles réponses ont été en - au moins certains de ces offrent de meilleures solutions.

Mise à jour 3: La ptools gem a ajoute un "qui" méthode de la classe File.

127voto

mislav Points 7379

La vraie-croix-plate-forme de solution, fonctionne correctement sur Windows:

# Cross-platform way of finding an executable in the $PATH.
#
#   which('ruby') #=> /usr/bin/ruby
def which(cmd)
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
    exts.each { |ext|
      exe = File.join(path, "#{cmd}#{ext}")
      return exe if File.executable?(exe) && !File.directory?(exe)
    }
  end
  return nil
end

Ce n'est pas l'utilisation de l'OS hôte reniflant, et respecte $PATHEXT qui répertorie valide les extensions des fichiers exécutables Windows.

Les bombardements d' which fonctionne sur de nombreux systèmes, mais pas tous.

84voto

NARKOZ Points 12220

Utiliser find_executable méthode de mkmf qui est inclus à stdlib.

require 'mkmf'

find_executable 'ruby'
#=> "/Users/narkoz/.rvm/rubies/ruby-2.0.0-p0/bin/ruby"

find_executable 'which-ruby'
#=> nil

17voto

blueyed Points 7719
def command?(name)
  `which #{name}`
  $?.success?
end

D'abord pris de hub, qui a utilisé type -t au lieu de which (et qui a échoué pour deux zsh, bash, et pour moi).

5voto

rogeriopvl Points 9619

Vous pouvez accéder aux variables d'environnement du système avec l'ENV de hachage:

puts ENV['PATH']

Il sera de retour le CHEMIN d'accès sur votre système. Donc, si vous voulez savoir si le programme est en nmap existe, vous pouvez le faire:

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

Cela permettra d'imprimer true si le fichier a été trouvé ou false sinon.

3voto

Arto Bendiken Points 591

Voici ce que j'utilise. C'est une plate-forme neutre (File::PATH_SEPARATOR est ":" sur Unix et ";" sur Windows), recherche uniquement pour les fichiers de programme qui sont réellement exécutable par l'utilisateur en vigueur de la procédure en cours, et s'arrête dès que le programme est trouvé:

##
# 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X