startコマンドぽいもの

拡張子を見て、設定したコマンドを起動するスクリプトを作ってみた。Windowsでダブルクリックする感じ。というかこんなの絶対誰かやってるよなー。車輪の再発明だな、きっと。

こんな感じで環境変数を設定して、

STARTS="txt=less:c=gcc -ggdb -Wall"
STARTS="${STARTS}:tgz=tar zxvf:tar.gz=tar zxvf"
STARTS="${STARTS}:tbz=tar yxvf:tar.bz2=tar yxvf"
STARTS="${STARTS}:zip=unzip:lha=lha x"
STARTS="$STARTS:gif=xli:jpeg=xli"
export STARTS
export START_DEFAULT='less'

以下の内容のファイルを作成する(ここでは、sというファイル名にする)。

#!/usr/bin/env ruby
# -*- ruby -*-
# $Id: s,v 1.6 2005/03/26 11:12:22 s-tanaka Exp $

def shell(*cmds)
  $stderr.puts '=> ' + cmds.join(' ')

  # exec shell(and load ~/.profile)
  # ONLY support POSIX shell.

  ENV['ENV'] = ENV['HOME'] + '/.profile'
  exec(ENV['SHELL'], '-i', '-c', cmds.join(' '))
end

def exec_cmd(args)
  cmd = nil
  if args.size > 0
    @ext2cmd.each do |ext, realcmd|
      if args[0] =~ Regexp.new('\.' + ext + '$', Regexp::IGNORECASE)
        cmd = realcmd
        break
      end
    end
  end
  cmd = @defualt_cmd unless cmd
  shell(cmd, *args)
end

# main

@defualt_cmd = ENV['START_DEFAULT']
@defualt_cmd = 'ls -l' unless @defualt_cmd

@ext2cmd = {}
starts = ENV['STARTS']
starts = 'txt=less' unless starts
starts.split(/:/).each do |elem|
  next if elem !~ /=/
  @ext2cmd[$`] = $'
end

exec_cmd(ARGV)

# end

(2005/03/26 バグフィックス(^^;;)

んで、次のように使う。

$ s foo.tar.gz # tar zxvf foo.tar.gzを実行。
$ s foo.txt    # デフォルトのlessが起動。

このスクリプトのポイントは、

  • (環境変数で設定しているので)独自の設定ファイルがない。
  • シェルを起動してるので、(普段使っている)エイリアスなどの設定が有効になっている(その代わりcshじゃ動かない)。

ことかな。
おおそうだ。このプログラムのライセンスは修正BSDライセンスです。