bashでlambdaっぽくコマンド実行

よくCDを焼くのが面倒なんで、イメージファルをサーバに置いて、マウントしてftpインストールということをやるんですけど、枚数が多いと、

mount -o loop cdrom1.img /mnt
umount
mount -o loop cdrom2.img /mnt

みたいにコマンドをうたなくちゃいけなくて、番号のところまでカーソル持って行くのだるいなぁと思っていて、書き換えなきゃいけない部分が後ろだと楽だと思うから、そんなのスクリプト書けばいいじゃんと思っても、いちいちファイル作るのに名前考えたり面倒だと思っていて、lambda式っぽく書けたららくなのにと思ったから、こんなの書いてしまいましたというお話。

ruby taka$ cat lambda.rb 
#! /usr/bin/ruby

comand = ARGV[0].dup
ARGV.shift
(ARGV.zip( (1..(ARGV.length)).to_a)).each do | c , i |
        suffix = Regexp.new "\\$#{i}"
        comand.gsub!( suffix , c )
end
ret =`#{comand}`
puts ret if ret.length != 0


ruby taka$ cat map.rb 
#! /usr/bin/ruby

comand = ARGV[0].dup
ARGV.shift
ARGV.each do | c  |
        suffix = Regexp.new "\\$1"
        ret =`#{comand.gsub( suffix , c )}`
        puts ret if ret.length != 0
end

ついでに、injectがあればmapはいらないと思いながら、bashにはinjectが無いからmapも作ってみました。

こんなかんじで、動きます。

ruby taka$ ./lambda.rb  "echo \"\$3 \$2 \$1\"" hoge moge moo
moo moge hoge
ruby taka$ ./map.rb  "echo \$1" hoge moge moo
hoge
moge
moo

$の前に、\が必要なのは、bashが$1を展開しちゃうから。動作を試すときにはまった。

まじめに作っていないので、きちんとβ簡約できておらず、このコマンド自体が入れ子になるときちんと動きません。

これをつくっていいてはまったのが、lambdaというコマンドが実は存在していたということ。なんか、omegaというtex関係のコマンドのシンボリックリンクになっていた。