Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Executing shell commands from Ruby... again.

Reply
Thread Tools

Executing shell commands from Ruby... again.

 
 
Kevin Skrenes
Guest
Posts: n/a
 
      03-16-2007
I'm not only very new to Ruby, but also to server side programming in
general, so I'm having a hard time finding a good place to look for
solutions.

I've seen a number of posts regarding the execution of shell commands
from Ruby / Rails, but I can't figure out a way to call a shell process
and retain a reference to it so that I can execute successive commands.
I need to do this on a Windows machine, so a typical batch file might be
constructed like this:

echo off
cd path\executabledir
<command> -S <param> <input> <output>

where anything in <> needs to be dynamically populated. I'm able to
execute a batch file with the information hard-coded using
IO.popen("batchfile"), but I need to be able to manipulate the shell
commands before running them.

If anyone knows of any fitting resources that a newbie to this entire
concept could understand, please let me know.

Thanks.

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Jan Friedrich
Guest
Posts: n/a
 
      03-16-2007
Kevin Skrenes schrieb:
> I need to do this on a Windows machine, so a typical batch file might be
> constructed like this:
>
> echo off
> cd path\executabledir
> <command> -S <param> <input> <output>
>
> where anything in <> needs to be dynamically populated.

How about this:

# -- BEGIN OF EXAMPLE

# setting command, param, input, output
# ...
cmd = <<END_OF_STRING
echo off
cd path\executabledir
#{command} -S #{param} #{input} #{output}
END_OF_STRING

system(cmd)

# -- END OF EXAMPLE


regards
Jan
 
Reply With Quote
 
 
 
 
Kevin Skrenes
Guest
Posts: n/a
 
      03-16-2007
Jan Friedrich wrote:
> How about this:
>
> # -- BEGIN OF EXAMPLE
>
> # setting command, param, input, output
> # ...
> cmd = <<END_OF_STRING
> echo off
> cd path\executabledir
> #{command} -S #{param} #{input} #{output}
> END_OF_STRING
>
> system(cmd)
>
> # -- END OF EXAMPLE


That makes perfect sense, but for some reason I'm getting this error:
: can't find string "END_OF_STRING" anywhere before EOF
: syntax error, unexpected $end, expecting tSTRING_CONTENT or
tSTRING_DBEG or tSTRING_DVAR or tSTRING_END

I'm still working on it, but this solution seems to be ideal as long as
I can get it to function properly.

Alex, you're exactly right, I certainly have no problems using variables
to construct a String. I was merely saying that the batch file
solution was insufficient because I can't create its content
dynamically. Thanks for your reply, I'll check out the file you
provided.

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      03-16-2007
On 16.03.2007 21:58, Jan Friedrich wrote:
> Kevin Skrenes schrieb:
>> I need to do this on a Windows machine, so a typical batch file might be
>> constructed like this:
>>
>> echo off
>> cd path\executabledir
>> <command> -S <param> <input> <output>
>>
>> where anything in <> needs to be dynamically populated.

> How about this:
>
> # -- BEGIN OF EXAMPLE
>
> # setting command, param, input, output
> # ...
> cmd = <<END_OF_STRING
> echo off
> cd path\executabledir
> #{command} -S #{param} #{input} #{output}
> END_OF_STRING
>
> system(cmd)
>
> # -- END OF EXAMPLE


You can even combine that:

system <<CMD
echo off
cd path
#{command} -S #{arg}
CMD

And if you need a longer running shell that executes multiple commands
you can use popen:

# IO.popen("bash", "r+") do |io|
IO.popen("cmd", "r+") do |io|
th = Thread.new(io) do |chan|
chan.each {|line| puts line}
end

# io.puts "ls -l"
io.puts "dir"
io.puts "exit"
io.close_write

th.join
end

Kind regards

robert
 
Reply With Quote
 
Stefano Crocco
Guest
Posts: n/a
 
      03-16-2007
Alle venerd=C3=AC 16 marzo 2007, Kevin Skrenes ha scritto:
> That makes perfect sense, but for some reason I'm getting this error:
> : can't find string "END_OF_STRING" anywhere before EOF
> : syntax error, unexpected $end, expecting tSTRING_CONTENT or
>
> tSTRING_DBEG or tSTRING_DVAR or tSTRING_END


Are you sure that the second END_OF_STRING is right at the beginning of the=
=20
line? What I mean is that the following code

cmd =3D <<END_OF_STRING
text
END_OF_STRING

will produce exactly the error message you get, because the closing=20
END_OF_STRING is not at the beginning of the line (there are some whitespac=
es=20
before it). The correct form is:

cmd =3D <<END_OF_STRING
text
END_OF_STRING

If you really want some spaces before the closing END_OF_STRING, you should=
=20
use the <<- form:

cmd =3D <<-END_OF_STRING
text
END_OF_STRING

which allows spaces before the closing tag.

I hope this helps

Stefano

 
Reply With Quote
 
Kevin Skrenes
Guest
Posts: n/a
 
      03-16-2007
Stefano Crocco wrote:
> Alle venerdì 16 marzo 2007, Kevin Skrenes ha scritto:
> Are you sure that the second END_OF_STRING is right at the beginning of
> the
> line?
>
> ...
>
> If you really want some spaces before the closing END_OF_STRING, you
> should
> use the <<- form


Well, I didn't have any indenting going on, but the <<- syntax fixed the
problem anyway. It's probably just my crappy editor.

It would seem that everything is working - the system method executes
and returns true, and if I print out the command, it's identical to what
was in my batch file, but the batch file creates the desired output, and
the system method creates nothing.

Could it be an issue of each line hitting the shell before the previous
line has completed? I need to research Robert's IO.popen solution to
get a better grasp of what's happening there - perhaps that method is
more appropriate.

Thanks, everybody, for all your help.

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      03-17-2007
On 16.03.2007 23:37, Kevin Skrenes wrote:
> It would seem that everything is working - the system method executes
> and returns true, and if I print out the command, it's identical to what
> was in my batch file, but the batch file creates the desired output, and
> the system method creates nothing.


The output of system goes to stdout. If you want to capture it the
popen method is better.

> Could it be an issue of each line hitting the shell before the previous
> line has completed?


No, normally not. Unless of course you tell the shell to put things
into background.

> I need to research Robert's IO.popen solution to
> get a better grasp of what's happening there - perhaps that method is
> more appropriate.


Kind regards

robert
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Ruby executing shell commands Guilherme Viteri Ruby 2 09-08-2010 08:09 PM
executing shell commands from c? Kentor C Programming 10 03-20-2007 04:00 PM
executing commands in the same shell in Windows using Perl Murugesh Perl Misc 5 12-07-2005 04:25 PM
executing shell commands in asp mlay ASP General 2 11-09-2003 03:25 PM
Re: man pages for C commands (GCC commands) Ben Pfaff C Programming 4 06-28-2003 06:21 PM



Advertisments