Subscribed unsubscribe Subscribe Subscribe

枕を欹てて聴く

香炉峰の雪は簾を撥げて看る

command.exist? + library.exist?

Ruby

Linux系でcommandが存在するか確認. 要はwhich的なもの.

@env_path = ENV['PATH'].split(':')
def command_path cmd
  result = nil
  res = @env_path.detect do |path|
    File.exist?(result = File.join(path, cmd))
  end
  return res ? result : nil
end

で確認できる.
screenとかでlessとか開かせたいときに

system('screen less ~/work/something')

ってやると, .zshrcとか.bashrcとかで

alias screen="screen -xRU"

とかやってる人は失敗するので危険.
上のでpathをつかんで

cmd = command_path('screen')
# cmd はうちの場合 /usr/bin/screen
system("#{cmd} less ~/work/something")

とかにするとまだ安全(full pathなので)
あと, 豆知識的なもので, screen内にいるかどうかは

  ENV.key?('STY')

であっさり確認できる.

あとこのやり方で,

def exist_library? name
  result = nil
  res = $:.detect do |path|
    File.exist?(result = File.join(path,name))
  end
  return res ? result : nil
end

ってやるとRubyのlibraryの存在確認ができる.
requireのnot found的エラーはrescueで捕捉できないので, あったら読み込むみたいなのはこれで確認してから読むといいかも.

最近はすこし作りたいものがあって, 家に帰るとRubyJavaScript触ってる.