gpt4 book ai didi

Ruby 使用标准输入两次

转载 作者:数据小太阳 更新时间:2023-10-29 09:02:22 25 4
gpt4 key购买 nike

连续到this question

我有一个用 ruby​​ 编写的 git 钩子(Hook)。我想使用来自 stdin 的输入两次。我有两个相同类型(接收后)的 git 钩子(Hook),并希望它们都像被 git 调用一样执行。第一个钩子(Hook)在 ruby​​ 中,是 gitlab git 的默认钩子(Hook)。其次是我尚未创建的 bash 脚本。我希望尽可能保持第一个 ruby​​ 钩子(Hook)不变,尽管添加几行就可以了。

最佳答案

在这种情况下,我假设标准输入是一个管道。

您不能倒带管道。你需要做的是copy将管道的数据放入一个常规文件中,然后将该文件用作您正在调用的两个进程的标准输入。

(也可以复制到内存缓冲区,然后用管道将内容发送给两个进程。)


更新:这是一个简单的 Ruby 脚本,它检查 stdin 是否是一个常规文件,如果不是,它会创建一个临时文件并首先将 stdin 复制到它,然后将 stdin 重新绑定(bind)到临时文件。然后它将每个参数作为命令运行:

#!/usr/bin/ruby
require 'tempfile'

unless File.file?($stdin)
Tempfile.open('stdin') do |temp|
IO.copy_stream($stdin, temp)
$stdin.reopen(temp)
temp.unlink
end
end

ARGV.each do |arg|
$stdin.rewind
system arg
end

示例用法(假设文件在当前目录中名为multiwrite):

$ echo foo | ./multiwrite cat 'tr a-z A-Z' 'tr a-z n-za-m'
foo
FOO
sbb

如果是常规文件,那么解决方案很简单:调用第一个进程,然后倒带,然后调用第二个进程。

关于Ruby 使用标准输入两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32322794/

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