Ruby 使用标准输入两次
Ruby use stdin twice
连续到 this question
我有一个用 ruby 编写的 git 钩子。我想使用来自 stdin 的输入两次。我有两个相同类型(post-接收)的 git 挂钩,并希望它们都像被 git 调用一样执行。第一个挂钩在 ruby 中,是 gitlab git 的默认挂钩。第二个是我尚未创建的 bash 脚本。我宁愿让第一个 ruby 钩子尽可能保持不变,尽管添加几行就可以了。
我假设 stdin 在这种情况下是一个管道。†
你不能倒带烟斗。您需要做的是 copy 管道数据到一个常规文件中,然后将该文件用作您正在调用的两个进程的标准输入。
(也可以copy到内存缓冲区,然后用管道将内容发送到两个进程。)
更新:这是一个简单的 Ruby 脚本,它检查 stdin 是否是常规文件,如果不是,它会创建一个临时文件并首先将 stdin 复制到它,然后将 stdin 重新绑定到临时文件。然后它将每个参数作为命令运行:
#!/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
†如果是普通文件,解决方法很简单:调用第一个进程,然后倒带,再调用第二个进程。
连续到 this question
我有一个用 ruby 编写的 git 钩子。我想使用来自 stdin 的输入两次。我有两个相同类型(post-接收)的 git 挂钩,并希望它们都像被 git 调用一样执行。第一个挂钩在 ruby 中,是 gitlab git 的默认挂钩。第二个是我尚未创建的 bash 脚本。我宁愿让第一个 ruby 钩子尽可能保持不变,尽管添加几行就可以了。
我假设 stdin 在这种情况下是一个管道。†
你不能倒带烟斗。您需要做的是 copy 管道数据到一个常规文件中,然后将该文件用作您正在调用的两个进程的标准输入。
(也可以copy到内存缓冲区,然后用管道将内容发送到两个进程。)
更新:这是一个简单的 Ruby 脚本,它检查 stdin 是否是常规文件,如果不是,它会创建一个临时文件并首先将 stdin 复制到它,然后将 stdin 重新绑定到临时文件。然后它将每个参数作为命令运行:
#!/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
†如果是普通文件,解决方法很简单:调用第一个进程,然后倒带,再调用第二个进程。