snacktime wrote: > 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 :output,: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.freemail.gr - δωρεάν υπηρεσία ηλεκτρονικού ταχυδρομείου. http://www.freemail.gr - free email service for the Greek-speaking.
> 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 :) ).
In initialize block_given? is returning false for me. Any idea why?
snacktime wrote: > On 11/24/05, Damphyr <damp...@freemail.gr> wrote:
>>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 :) ).
> 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?).
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.freemail.gr - δωρεάν υπηρεσία ηλεκτρονικού ταχυδρομείου. http://www.freemail.gr - free email service for the Greek-speaking.
Kaspar Schiess wrote: > 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 :-)
> 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.
> snacktime wrote: > > On 11/24/05, Damphyr <damp...@freemail.gr> wrote:
> >>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 :) ).
> > 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?).
Ya I shouldn't be up this late either. No I didn't pass the block:)
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.
> > 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.
Kaspar Schiess wrote: > 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!