Project

General

Profile

Feature #10395

Updated by nobu (Nobuyoshi Nakada) over 9 years ago

This would make erb more useful from the command line. Granted the use of Binding#eval is dangerous so one has to be careful. Newer versions of Ruby have Binding#local_variable_set which can be used instead but this works with Ruby 2.0.0. 

 

  ~~~ 
 jonagold:local jos$ cat /tmp/erb-template 
 This is <%= foo %> 
 And this is <%= bar %> 
 ~~~ 
 ~~~diff 
 jonagold:local jos$ diff -u /usr/bin/erb /tmp/erb 
 --- /usr/bin/erb 	 2014-05-15 22:14:36.000000000 -0700 
 +++ /tmp/erb 	 2014-10-16 22:29:37.000000000 -0700 
 @@ -114,6 +114,13 @@ 
          exit 1 
        end 

 +        vars = ARGV.take_while {|arg| arg[/^\w+=/]} 
 +        ARGV.slice!(0, vars.size) 
 +        vars.each do |var| 
 +          k, v = var.split('=', 2) 
 +          TOPLEVEL_BINDING.eval %Q(#{k} = "#{v}") 
 +        end 
 + 
        $<.set_encoding(Encoding::ASCII_8BIT, nil) 
        src = $<.read 
        filename = $FILENAME 
 ~~~ 
 ~~~ 
 jonagold:local jos$ /tmp/erb foo=FOO bar=123 /tmp/erb-template 
 This is FOO 
 And this is 123 
 jonagold:local jos$ 
 ~~~

Back