Project

General

Profile

Actions

Bug #10362

closed

spawn doesn't raise exception on redirection error

Added by bdimych (Dmitry Bolshakov) almost 8 years ago. Updated about 3 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.0.0p247 (2013-06-27) [i386-mingw32]
[ruby-core:65595]

Description

irb(main):002:0*
irb(main):003:0*
irb(main):004:0* system 'cmd', '/c', 'echo', 'aaa'
aaa
=> true
irb(main):005:0>
irb(main):006:0*
irb(main):007:0*
irb(main):008:0* system 'cmd', '/c', 'echo', 'aaa', :out => ['bad/file.txt', 'w']
=> nil
irb(main):009:0>
irb(main):010:0*
irb(main):011:0*
irb(main):012:0*
irb(main):013:0* system 'cmd', '/c', 'echo', 'aaa', :out => File.open('bad/file.txt', 'w')
Errno::ENOENT: No such file or directory - bad/file.txt
        from (irb):13:in `initialize'
        from (irb):13:in `open'
        from (irb):13
        from C:/Ruby200/bin/irb:12:in `<main>'
irb(main):014:0>
irb(main):015:0*
irb(main):016:0*

exception is much more descriptive than just nil

Updated by normalperson (Eric Wong) almost 8 years ago

wrote:

irb(main):013:0* system 'cmd', '/c', 'echo', 'aaa', :out => File.open('bad/file.txt', 'w')
Errno::ENOENT: No such file or directory - bad/file.txt
from (irb):13:in initialize' from (irb):13:in open'
from (irb):13
from C:/Ruby200/bin/irb:12:in `'

exception is much more descriptive than just nil

Right, but I think the system' method is intended to hide errors by default. $? must be checked when system' returns nil:

if system('non-existent-command').nil?
  $? => #<Process::Status: pid ... exit 127>
end

I think it is in the spec for `system' to behave like this.

Updated by nobu (Nobuyoshi Nakada) almost 8 years ago

Yes, it's intentional spec, but to raise errors Process.spawn and Process.wait are needed.
It may be good to add an option for errors to system.

Updated by normalperson (Eric Wong) almost 8 years ago

On the other hand, maybe we should allow Ruby-level options to `system'
to raise, but continue hiding errors when running the command itself.

In other words:

# continue old 1.8 behavior if redirect is done via shell
# (n.b. this example is bad practice, but just an example)
system('true >bad/file.txt') -> nil

So I think the original example by Dmitry should raise:

system('true', out: %w(bad/file.txt w)) -> Errno...

Maybe this (potentially incompatible) change can be acceptable
for 2.2 (if not, then for Ruby 3.0)

Updated by jeremyevans0 (Jeremy Evans) about 3 years ago

  • Status changed from Open to Closed

system was made more strict for redirection errors between Ruby 2.2 and 2.3:

speedstar$ ruby22 -e "p system('true', out: %w(bad/file.txt w))"
nil

speedstar$ ruby23 -e "p system('true', out: %w(bad/file.txt w))" 
-e:1:in `system': No such file or directory - bad/file.txt (Errno::ENOENT)
        from -e:1:in `<main>'
Actions

Also available in: Atom PDF