如何让Ruby脚本输出system命令的全部内容(含stderr)
解决Ruby脚本中system命令不输出stderr的问题
Ruby的system方法默认仅将子进程的标准输出(stdout)映射到当前终端,标准错误(stderr)不会被打印,所以你看不到编译错误或程序崩溃(比如segmentation fault)的信息。以下是几种可行的解决方式:
方法一:命令内重定向stderr到stdout
在执行的命令末尾添加2>&1,将stderr的内容重定向到stdout,这样所有输出都会被Ruby打印到终端:
system "clang test.c -o test 2>&1" system "./test 2>&1"
方法二:使用Open3库捕获并输出所有流
Ruby标准库中的Open3可以分别捕获子进程的stdout、stderr和退出状态,适合需要更精细控制输出的场景:
require 'open3' # 执行编译命令并输出结果 compile_out, compile_err, compile_status = Open3.capture3("clang test.c -o test") puts compile_out unless compile_out.empty? puts compile_err unless compile_err.empty? # 执行程序并输出结果 run_out, run_err, run_status = Open3.capture3("./test") puts run_out unless run_out.empty? puts run_err unless run_err.empty? # 可选:检查退出状态,segmentation fault通常对应退出码139 puts "程序退出码: #{run_status.exitstatus}" if run_status.exitstatus != 0
方法三:使用spawn结合IO重定向
spawn方法可以显式指定子进程的IO重定向,将stderr绑定到当前进程的stderr:
# 编译命令 spawn("clang test.c -o test", :err => :out).wait # 运行命令 spawn("./test", :err => :out).wait
这里:err => :out表示将子进程的stderr重定向到和stdout相同的输出流,wait方法会等待子进程执行完毕。
内容的提问来源于stack exchange,提问作者Jomy
相关产品推荐
相关产品推荐

