gpt4 book ai didi

ruby - 如何包含使用 FileUtils#sh 执行命令的管道?

转载 作者:数据小太阳 更新时间:2023-10-29 07:59:34 24 4
gpt4 key购买 nike

我对 Ruby 的了解已经够多了,所以我主要通过 API 文档中的示例来编写一堆构建自动化脚本作为 Rake 任务。

我正在使用如下代码编写一堆构建命令的脚本:

results = {}
schemes.each { |scheme|
command = "xcodebuild", "-scheme", scheme
if options.configuration
command.push "-configuration", options.configuration
end
command.push "archive"

sh *command do |ok, res|
results[scheme] = ok
end
}

这工作正常,但是会将大量很多 输出转储到控制台,这有点碍事。所以我很乐意通过 xcpretty 传递这些东西重新格式化它。

如果我真的从我的终端运行命令,它工作正常:

xcodebuild -scheme Foo -configuration Release archive | xcpretty

但是如果我修改 Rake 任务以将这些部分附加到命令数组的末尾,sh 认为它们是 xcodebuild 的参数。

    command.push "archive", "|", "xcpretty"

我见过很多使用 sh 的例子,其中管道是字符串形式的,而不是数组形式的。由于我正在构建的命令的性质——可选参数、带空格和其他字符的参数——数组形式处理起来更简洁。但是有没有办法在使用时包含输出管道?

最佳答案

一个好的解决方案是使用 Open3 ,Ruby 的标准部分,具有许多用于打开进程和安排管道的实用程序。

这是一个对我有用的例子:

require 'open3'
Open3.pipeline(['ls', '-l'], ['grep', 'z'])

当您运行它时,管道中最后一个命令的标准输出管道将连接到 Ruby 进程的预先存在的标准输出管道。这意味着您将能够在生成任何输出时立即看到它,而不是等待进程结束。这种方法的另一个好处是它不会生成 shell;它只是直接生成进程。

另一种选择是简单地使用 Array#join在将参数传递给 sh 之前用空格将参数连接在一起。您只需要注意您的论点中可能有空格的可能性,如果是这样,那么您必须正确地引用或转义它们。此方法会生成一个 shell 来处理您的命令,它还应该为长时间运行的进程提供即时输出。

关于ruby - 如何包含使用 FileUtils#sh 执行命令的管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28282519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com