system() on windows

S

snacktime

I'm trying to figure out why a particular system command is returning
false on windows.

This works fine and returns true:

res =3D system('dir')

This returns false with $? being nil:

res =3D system('rake')

if I just run rake at the command line it works fine. I'm sure this
is something simple, but windows is not a development environment I am
used to.

Chris
 
L

Lyndon Samson

------=_Part_5683_4298119.1132869812549
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

I'm trying to figure out why a particular system command is returning
false on windows.

This works fine and returns true:

res =3D system('dir')

This returns false with $? being nil:

res =3D system('rake')

Windows return codes where never as standardised as Unix. Plus dir is part
of the command shell, not a standalone exec.

------=_Part_5683_4298119.1132869812549--
 
D

Damphyr

snacktime said:
I'm trying to figure out why a particular system command is returning
false on windows.

This works fine and returns true:

res = system('dir')

This returns false with $? being nil:

res = system('rake')

if I just run rake at the command line it works fine. I'm sure this
is something simple, but windows is not a development environment I am
used to.
Try cmd=ExecCmd.new("rake");puts cmd.success?;puts cmd.output using the
class at the end of this message (Ara's solution for grabbing the output
of stderr and stdout on windows with a broken popen3 was better -
giving you separate stderr und stdout - but this one has benchmarking
too :) ).

I get

false
rake aborted!
No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb,
Rakefile.rb)
d:/dev/ruby/lib/ruby/gems/1.8/gems/rake-0.6.2/lib/rake.rb:1373:in
`load_rakefile'

on a directory without a rakefile, which is correct :).

system("rake") for the same directory gives a $? of 256.

--------
class ExecCmd
attr_reader :eek:utput,:cmd,:exec_time
#When a block is given, the command runs before yielding
def initialize cmd
@cmd=cmd
@cmd_run=cmd+" 2>&1" unless cmd=~/2>&1/
if block_given?
run
yield self
end
end
#Runs the command
def run
t1=Time.now
IO.popen(@cmd_run){|f|
@output=f.read
@process=Process.waitpid2(f.pid)[1]
}
@exec_time=Time.now-t1
end
#Returns false if the command hasn't been executed yet
def run?
return false unless @process
return true
end
#Returns the exit code for the command. Runs the command if it hasn't
run yet.
def exitcode
run unless @process
@process.exitstatus
end
#Returns true if the command was succesfull.
#
#Will return false if the command hasn't been executed
def success?
return @process.success? if @process
return false
end
end

--
http://www.braveworld.net/riva

____________________________________________________________________
http://www.freemail.gr - äùñåÜí õðçñåóßá çëåêôñïíéêïý ôá÷õäñïìåßïõ.
http://www.freemail.gr - free email service for the Greek-speaking.
 
S

snacktime

Try cmd=3DExecCmd.new("rake");puts cmd.success?;puts cmd.output using th= e
class at the end of this message (Ara's solution for grabbing the output
of stderr and stdout on windows with a broken popen3 was better -
giving you separate stderr und stdout - but this one has benchmarking
too :) ).

In initialize block_given? is returning false for me. Any idea why?

Chris
 
K

Kaspar Schiess

(In response to
by
snacktime)
res = system('rake')
I call ruby scripts by
system('cmd.exe /c rake')

Sadly, system seems to be broken many ways on windows.

kaspar
 
D

Damphyr

snacktime said:
In initialize block_given? is returning false for me. Any idea why?
Did you pass a block? Actually I missed cmd.run in there (what do you
expect at quarter to two?).

You can do it like this:

ExecCmd.new("rake"){|cmd|
puts cmd.success?
puts cmd.output
}
or like this:

cmd=ExecCmd.new("rake")
cmd.run
puts cmd.success?
puts cmd.output

But a nice sideeffect of this implementation was
cmd1=ExecCmd.new("blabla")
cmd2=ExecCmd.new("blabla2")
cmd3=ExecCmd.new("blabla3")
[cmd1,cmd2,cmd3].each{|cmd|
cmd.run
#do stuff with it
}
And afterwards you also have a crude benchmark for each command i.e. :)
[cmd1,cmd2,cmd3]each{|cmd|
if cmd.run?
status="succeeded"
status="failed" unless cmd.success?
puts "#{cmd.cmd} #{status} in #{cmd.exec_time}s"
puts "Log:\n#{cmd.output}" unless cmd.success?
else
puts "#{cmd.cmd} was not executed"
end
}
--
http://www.braveworld.net/riva

____________________________________________________________________
http://www.freemail.gr - äùñåÜí õðçñåóßá çëåêôñïíéêïý ôá÷õäñïìåßïõ.
http://www.freemail.gr - free email service for the Greek-speaking.
 
G

gregarican

Kaspar said:
I call ruby scripts by
system('cmd.exe /c rake')

Sadly, system seems to be broken many ways on windows.


kaspar

How is this broken? the system() method works directly with the Windows
shell. And the rake command isn't contained within the Windows shell as
an internal command. That's why system('dir') works and system('rake')
doesn't. This would seem logical in my opinion and I am far from a
Microsoft fanboy :)
 
K

Kaspar Schiess

Hi gregarican,
How is this broken? the system() method works directly with the Windows
shell. And the rake command isn't contained within the Windows shell as
an internal command. That's why system('dir') works and system('rake')
doesn't. This would seem logical in my opinion and I am far from a
Microsoft fanboy :)

On my unix shell:
--------------------------
eule@makkara:~> rake
rake aborted!
No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb,
Rakefile.rb)
/usr/local/lib/ruby/gems/1.8/gems/rake-0.5.4/lib/rake.rb:1222:in
`load_rakefile'
eule@makkara:~> irb
irb(main):001:0> system 'rake'
rake aborted!
No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb,
Rakefile.rb)
/usr/local/lib/ruby/gems/1.8/gems/rake-0.5.4/lib/rake.rb:1222:in
`load_rakefile'
=> false
---------------------------

On windows:
---------------------------
D:\temp>rake
rake aborted!
No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb,
Rakefile.rb)
c:/unix/ruby/lib/ruby/gems/1.8/gems/rake-0.6.2/lib/rake.rb:1373:in
`load_rakefile'
D:\temp>irb
irb(main):001:0> system 'rake'
=> false
---------------------------

I think I know how this happens and everything (having done quite some c
programming on windows), its just that I think that it breaks
expectations. I hope I could illustrate my point.

kaspar
 
S

snacktime

Did you pass a block? Actually I missed cmd.run in there (what do you
expect at quarter to two?).

Ya I shouldn't be up this late either. No I didn't pass the block:)

Chris
 
K

Kaspar Schiess

A small follow up...

Looks like as soon as you have a pipe in the command, cmd.exe is invoked
correctly: system 'echo | rails'. I came up with this after digging trough
to the actual implementation and nosing around for quite a time ;) .. its
of course nonsensical.

k
 
N

nobuyoshi nakada

Hi,

At Fri, 25 Nov 2005 06:21:03 +0900,
snacktime wrote in [ruby-talk:167407]:
I'm trying to figure out why a particular system command is returning
false on windows.

This works fine and returns true:

res = system('dir')

This returns false with $? being nil:

res = system('rake')

system('rake.bat')
 
W

William James

gregarican said:
How is this broken? the system() method works directly with the Windows
shell. And the rake command isn't contained within the Windows shell as
an internal command. That's why system('dir') works and system('rake')
doesn't.

No; system('cal') works.
 
G

gregarican

Kaspar said:
I think I know how this happens and everything (having done quite some c
programming on windows), its just that I think that it breaks
expectations. I hope I could illustrate my point.


kaspar

You're correct. The fact that system() works much differently under
Windows does break expectations. Good illustration!
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,197
Messages
2,571,040
Members
47,635
Latest member
SkyePurves

Latest Threads

Top