Ruby Ruby 脚本中执行 其他 shell 命令, 控制台如何打印子线程的输出

clownfish · 2021年06月02日 · 最后由 clownfish 回复于 2021年06月09日 · 790 次阅读

目的: 有一个 Ruby 脚本,需要调用 shell 命令执行任务,shell 命令会输出很多 log 日志信息到控制台,需要在 ruby 脚本执行的线程中可见日志

目前尝试过的方案: 目前执行 shell 使用的是xxx 执行,会开辟一个子线程执行任务,导致 shell 的日志不会打印到当前控制台, 尝试了 exec 执行 shell 命令,虽然可以打印日志信息 (好像是因为 exec 不开启子线程执行任务), 但是 ruby 脚本中的后续代码不会再执行,直接退出了脚本

问题: 是否有办法,在子线程中执行任务,同时将子线程任务日志 输出到控制台,

得先明确下用的是 Thread 还是 Process,贴下代码是最方便的。

可能需要 Open3.capture3 或者 Open3.popen3

zhengpd 回复

开始用的``, 不支持打印,现在用 system() 临时解决了,但是问题就是没办法获取到返回数据了,但是暂时不用返回结果

kowalskidark 回复

我也不知道是 Thread 还是 Process, 我是在 ruby 脚本里调用了 Fastlane 一个自动构建的库,应该算 Thread 吧

kowalskidark 回复

例如我再一个脚本 test.rb 里面 执行 bundle install

system("bundle install")

# IO.popen("bundle install") {
#     |io|
#     io.each do |line|
#         puts line 
#     end
# }

# `bundle install`

我再执行 ruby test.rb 的时候 ,system 和 IO.popen 的方式,都可以在当前终端输出 using 的库, 但是``这种方式则完全没有输出,

system 和 IO.popen 的差别在于输出字体颜色的差异, 所以我应该用哪种方式在脚本调用执行时输出的内容和在另一个终端中直接 bundle install 的日志输出内容效果一致

clownfish 回复

Kernel#system 是开一个 subshell 去跑,然后直接输出到 stdout 和 stderr 上

Kernel#` 也是开一个 subshell,然后把 stdout 当作返回值给你

Open3#popen3 还是开一个 subshell,把 stdin,stdout,stderr 和 pid 当作自由变量传给你

这样解释清楚了吗

kowalskidark 回复

是的,大概了解了,刚学 ruby 好多东西都懵,我先去把 ruby 输入输出了解一下,... 十分感谢

需要 登录 后方可回复, 如果你还没有账号请 注册新账号