我有一个用ruby编写的git钩子。我想两次使用stdin的输入。我有两个相同类型(post-receive)的git hooks,并希望它们都被执行,好像它们被git调用一样。第一个钩子是ruby,是gitlab git的默认钩子。第二个是我尚未创建的bash脚本。我希望尽可能保持第一个红宝石钩子不受影响,尽管添加一些线条会很好。
答案 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
†如果它是常规文件,那么解决方案很简单:调用第一个进程,然后倒回,然后调用第二个进程。