1. ホーム
  2. ruby

[解決済み] "which in ruby "です。Rubyから$PATHにプログラムが存在するかチェックする

2023-08-02 14:59:59

質問

私のスクリプトは、外部のプログラムやスクリプトに大きく依存しています。 呼び出す必要のあるプログラムが存在することを確認する必要があります。 手動で、私はコマンドラインで 'which'を使用してこれをチェックします。

に相当するものはありますか? File.exists? に相当するものはありますか? $PATH ?

(そうです、私は %x[which scriptINeedToRun] を解析することもできますが、それは超エレガントではありません。

ありがとうございます。 yannick


UPDATE: 私が保持した解決策を紹介します。

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


UPDATE 2: いくつかの新しい回答が寄せられました - 少なくともこれらのいくつかはより良い解決策を提供しています。

最新情報 3: このページでは ptools gem によって、File クラスに "which" メソッドが追加されました。

どのように解決するのですか?

真のクロスプラットフォームソリューション、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 do |ext|
      exe = File.join(path, "#{cmd}#{ext}")
      return exe if File.executable?(exe) && !File.directory?(exe)
    end
  end
  nil
end

これはホストOSのスニッフィングを使わず、Windows上で実行可能なファイル拡張子をリストアップする$PATHEXTを尊重します。

へのシェリングアウト which は多くのシステムで動作しますが、すべてではありません。