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関係のコマンドのシンボリックリンクになっていた。