From: Steve Pauly on 1 Jul 2010 15:53 I am experimenting with running bash commands from within ruby. The commands should be in an array, separated internally with semicolons. The problem is that they do not get executed. My script: ---- #!/usr/bin/ruby script1=["touch ~/ruby/f1;touch ~/ruby/f2"] #addl array elements to be added puts script1[0].split(/;/) do |k| puts k system(k) end ---- The output from "puts k" looks good. But why do the files f1 and f2 not get created? I realize that executing commands this way in ruby may be bad practise, but at least, why do the commands not execute? Thanks in advance. Steve. -- Posted via http://www.ruby-forum.com/.
From: Jean-Julien Fleck on 1 Jul 2010 18:01 > script1=["touch ~/ruby/f1;touch ~/ruby/f2"] #addl array elements to > But why do the files f1 and f2 not get created? Does the directory ~/ruby/ already exist on your machine ? Cheers, -- JJ Fleck PCSI1 Lycée Kléber
From: Brian Buckley on 1 Jul 2010 19:43 > #!/usr/bin/ruby > script1=["touch ~/ruby/f1;touch ~/ruby/f2"] #addl array elements to > be added > puts script1[0].split(/;/) do |k| > puts k > system(k) > end > ---- > The output from "puts k" looks good. Your block is not being called. I think the output you are seeing the is from the first "puts", not the "puts" inside the block. You need to call "each" on the Array returned by split, like this: puts script1[0].split(/;/).each do |k| puts k system(k) end --Brian -- Posted via http://www.ruby-forum.com/.
From: Josh Cheek on 1 Jul 2010 20:02 [Note: parts of this message were removed to make it a legal post.] On Thu, Jul 1, 2010 at 2:53 PM, Steve Pauly <stevepauly(a)comcast.net> wrote: > I am experimenting with running bash commands from within ruby. The > commands should be in an array, separated internally with semicolons. > > The problem is that they do not get executed. > > My script: > > ---- > #!/usr/bin/ruby > script1=["touch ~/ruby/f1;touch ~/ruby/f2"] #addl array elements to > be added > puts script1[0].split(/;/) do |k| > puts k > system(k) > end > ---- > > The output from "puts k" looks good. > But why do the files f1 and f2 not get created? > > I realize that executing commands this way in ruby may be bad practise, > but at least, why do the commands not execute? > > Thanks in advance. > Steve. > -- > Posted via http://www.ruby-forum.com/. > > It has to do with block bindings. do ... end bind to the furthest left method call on the line, so in this case, the block is being passed to the puts method, not the split method. def puts( *args , &block ) super "puts received: #{args.inspect}, and #{block ? 'a' : 'no'} block." end script1=["touch ~/ruby/f1;touch ~/ruby/f2"] #addl array elements to be added puts script1[0].split(/;/) do |k| puts k system(k) end
From: Josh Cheek on 1 Jul 2010 20:23 [Note: parts of this message were removed to make it a legal post.] On Thu, Jul 1, 2010 at 7:02 PM, Josh Cheek <josh.cheek(a)gmail.com> wrote: > On Thu, Jul 1, 2010 at 2:53 PM, Steve Pauly <stevepauly(a)comcast.net>wrote: > >> I am experimenting with running bash commands from within ruby. The >> commands should be in an array, separated internally with semicolons. >> >> The problem is that they do not get executed. >> >> My script: >> >> ---- >> #!/usr/bin/ruby >> script1=["touch ~/ruby/f1;touch ~/ruby/f2"] #addl array elements to >> be added >> puts script1[0].split(/;/) do |k| >> puts k >> system(k) >> end >> ---- >> >> The output from "puts k" looks good. >> But why do the files f1 and f2 not get created? >> >> I realize that executing commands this way in ruby may be bad practise, >> but at least, why do the commands not execute? >> >> Thanks in advance. >> Steve. >> -- >> Posted via http://www.ruby-forum.com/. >> >> > > It has to do with block bindings. do ... end bind to the furthest left > method call on the line, so in this case, the block is being passed to the > puts method, not the split method. > > > > def puts( *args , &block ) > super "puts received: #{args.inspect}, and #{block ? 'a' : 'no'} block." > end > > > script1=["touch ~/ruby/f1;touch ~/ruby/f2"] #addl array elements to be > added > puts script1[0].split(/;/) do |k| > puts k > system(k) > end > > > Here is a solution that creates the files. ---------- script1=["touch ~/f1;touch ~/f2"] #addl array elements to be added script1[0].split(/;/).each do |k| puts k system k end ---------- Note that {} has the kind of binding that you were looking for, but that split does not take a block (which is why I added the each method). though I don't understand your format, are you wanting them to be separated by being elements in an array, or by splitting a string on semicolons? Right now, any other elements in this array will be ignored, because you only look at the one in index zero. (what is the point of the Array?) But you also have an issue if you split on semicolons, that assumes all semicolons are valid delimiters. Depending on context, this may not be the case. For example, what if the String was: %{echo "if ARGV.empty? ; puts 'no args' else puts 'got args' end" > argchecker.rb ; ruby argchecker.rb 1 2 3 ; ruby argchecker.rb} Then you want it to find these commands [ "echo \"if ARGV.empty? ; puts 'no args' else puts 'got args' end\" > argchecker.rb ", " ruby argchecker.rb 1 2 3 ", " ruby argchecker.rb" ] But split(';') will give you these commands [ "echo \"if ARGV.empty? ", " puts 'no args' else puts 'got args' end\" > argchecker.rb ", " ruby argchecker.rb 1 2 3 ", " ruby argchecker.rb" ] I think the best solution (easiest to implement, least likely to have bugs, most straightforward) is to keep each command separated in the Array, and not try to pull them from the string. If you do need to do that, you must either be careful to avoid using a semicolon in a way that is not a command delimiter, or you must find/write a parser so that you can determine where commands begin and end. I suppose you could also pick a different delimiter that is really unlikely to ever show up outside of the delimiter context. Some obscure unicode character, maybe.
|
Next
|
Last
Pages: 1 2 Prev: send_file sends an empty file to browser Next: FasterCSV - write tab delimited files |