Ruby使用stdin两次

时间:2015-09-01 02:51:34

标签: ruby git bash gitlab

连续到this question

我有一个用ruby编写的git钩子。我想两次使用stdin的输入。我有两个相同类型(post-receive)的git hooks,并希望它们都被执行,好像它们被git调用一样。第一个钩子是ruby,是gitlab git的默认钩子。第二个是我尚未创建的bash脚本。我希望尽可能保持第一个红宝石钩子不受影响,尽管添加一些线条会很好。

1 个答案:

答案 0 :(得分:2)

我假设stdin在这种情况下是一个管道。

您无法倒回管道。您需要做的是将管道的数据copy转换为常规文件,然后将该文件用作stdin,用于您正在呼叫的两个进程。

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

更新:这是一个简单的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

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