Executing shell commands from Ruby... again.

Discussion in 'Ruby' started by Kevin Skrenes, Mar 16, 2007.

  1. 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/.
     
    Kevin Skrenes, Mar 16, 2007
    #1
    1. Advertising

  2. 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
     
    Jan Friedrich, Mar 16, 2007
    #2
    1. Advertising

  3. 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/.
     
    Kevin Skrenes, Mar 16, 2007
    #3
  4. 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
     
    Robert Klemme, Mar 16, 2007
    #4
  5. 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
     
    Stefano Crocco, Mar 16, 2007
    #5
  6. 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/.
     
    Kevin Skrenes, Mar 16, 2007
    #6
  7. 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
     
    Robert Klemme, Mar 17, 2007
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Kentor

    executing shell commands from c?

    Kentor, Mar 19, 2007, in forum: C Programming
    Replies:
    10
    Views:
    805
    Ben Pfaff
    Mar 20, 2007
  2. mlay

    executing shell commands in asp

    mlay, Nov 9, 2003, in forum: ASP General
    Replies:
    2
    Views:
    198
    Aaron Bertrand [MVP]
    Nov 9, 2003
  3. vhaerun vh
    Replies:
    16
    Views:
    301
    Eleanor McHugh
    Sep 8, 2009
  4. Guilherme Viteri

    Ruby executing shell commands

    Guilherme Viteri, Sep 8, 2010, in forum: Ruby
    Replies:
    2
    Views:
    239
    Roger Pack
    Sep 8, 2010
  5. Murugesh
    Replies:
    5
    Views:
    199
Loading...

Share This Page