$?
будет содержать статус выхода после того, как вы закрыли f
. например,
irb(main):024:0> f = open("|#{cmd}", "r")
=> #<IO:0x2d7e9dc>
# read from f here
irb(main):025:0> f.close
=> nil
irb(main):026:0> $?
=> #<Process::Status: pid=3576,exited(0)>
irb(main):027:0> $?.exitstatus
=> 0