ruby - 如何执行在捕获输出时以彩色打印但也可以在 Ruby 中取消的系统命令?

标签 ruby terminal

Ruby 有很多方法来运行系统命令,无论是 system()、exec() 还是反引号等。

但是,我发现只有 system 和 exec(据我所知)能够打印我的一些命令的彩色输出,同时还提供允许我取消命令的 PID。

是否有任何其他方法可以从 Ruby 命令行脚本运行系统命令,以便我能够满足以下要求?

  1. 查看彩色输出(有助于组织)
  2. 捕获输出到一个变量
  3. 获得一个 PID,这样我就可以在需要时取消执行(我已经有了这方面的代码,我只需要 PID)

最佳答案

折腾了一会,发现IO.popen返回一个包含pid的对象,也可以用来打印所有捕获的输出。它也不会干扰从 Ruby 内部调用的系统命令的 ANSI 输出。我的代码现在看起来像这样:

#!/usr/bin/ruby

def shutdown()
    `kill #{$pid}`
end

["INT", "KILL", "TERM"].each { |_sig| Signal.trap(_sig) { shutdown() }     }

process = IO.popen("ls --color ~; ping -c 10 www.google.com")
$pid = process.pid
process.each { |_line| puts _line }

因此,我可以取消 ls 和 ping 命令,而无需从终端使用 control-C 取消我的 Ruby 代码,如果我愿意,还可以在打印它们之前操作这些行。

关于ruby - 如何执行在捕获输出时以彩色打印但也可以在 Ruby 中取消的系统命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34891355/

相关文章:

ruby-on-rails - 测试普通 ruby​​ 对象并将其集成到 Rails 3.2 应用程序中

java - (Mac) 运行 java 时,从另一个 shell 脚本调用 shell 脚本会出现访问错误

python 在 Mac 上安装更新版本后运行旧版本

linux - 查找在过去 15 分钟内更改的文件,不包括一些子目录并将其压缩

ruby-on-rails - Rails 应用程序意外抛出错误

ruby - 是什么导致我的 Ruby `trap` block 出现这种死锁?

javascript - js请求上的Rails ActionController::InvalidCrossOriginRequest

java - 如何使用 PBKDF2 在 Java 和 Ruby 中生成相同的安全哈希

macos - 如何在 Mac OS X 上查找串行端口号?

php - 如何使用 avconv 连接一系列视频