Capture all output without shelling out; use Open3.popen3