Forum: Ruby system() on windows

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
snacktime (Guest)
on 2005-11-24 22:21
(Received via mailing list)
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.

Chris
lyndon.samson (Guest)
on 2005-11-24 23:06
(Received via mailing list)
On 11/25/05, snacktime <snacktime@gmail.com> wrote:
> res = system('rake')
>

Windows return codes where never as standardised as Unix. Plus dir is
part
of the command shell, not a standalone exec.
damphyr (Guest)
on 2005-11-25 01:47
(Received via mailing list)
snacktime wrote:
>
> 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.braveworld.net/riva
snacktime (Guest)
on 2005-11-25 08:21
(Received via mailing list)
On 11/24/05, Damphyr <damphyr@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?

Chris
eule (Guest)
on 2005-11-25 09:06
(Received via mailing list)
(In response to
news:1f060c4c0511241320g4bf0af9bs16f14b86e51d358f@mail.gmail.com 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
damphyr (Guest)
on 2005-11-25 09:26
(Received via mailing list)
snacktime wrote:
> 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
0f4bf83f1b8516b301fcb6ccb7560013?d=identicon&s=25 Greg K. (gregarican)
on 2005-11-25 17:11
(Received via mailing list)
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 :-)
eule (Guest)
on 2005-11-25 18:52
(Received via mailing list)
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
snacktime (Guest)
on 2005-11-25 20:49
(Received via mailing list)
On 11/25/05, Damphyr <damphyr@freemail.gr> wrote:
> >
> > 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:)

Chris
eule (Guest)
on 2005-11-25 21:09
(Received via mailing list)
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
nobuyoshi.nakada (Guest)
on 2005-11-28 09:32
(Received via mailing list)
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_a_x_man (Guest)
on 2005-11-28 10:05
(Received via mailing list)
gregarican wrote:
> 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.
0f4bf83f1b8516b301fcb6ccb7560013?d=identicon&s=25 Greg K. (gregarican)
on 2005-11-28 18:47
(Received via mailing list)
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!
This topic is locked and can not be replied to.