Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby使用stdin两次_Ruby_Git_Bash_Gitlab - Fatal编程技术网

Ruby使用stdin两次

Ruby使用stdin两次,ruby,git,bash,gitlab,Ruby,Git,Bash,Gitlab,连续体 我有一个用ruby写的git钩子。我想使用stdin的输入两次。我有两个相同类型(post-receive)的git钩子,希望它们都像被git调用一样执行。第一个钩子是ruby,是gitlab git的默认钩子。第二个是我尚未创建的bash脚本。我更愿意让第一个ruby钩子尽可能保持不变,尽管添加几行就可以了。我假设stdin在本例中是一个管道。† 你不能倒带烟斗。您需要做的是将管道中的数据转换成一个常规文件,然后将该文件用作您正在调用的两个进程的stdin (也可以复制到内存缓冲区,然

连续体


我有一个用ruby写的git钩子。我想使用stdin的输入两次。我有两个相同类型(post-receive)的git钩子,希望它们都像被git调用一样执行。第一个钩子是ruby,是gitlab git的默认钩子。第二个是我尚未创建的bash脚本。我更愿意让第一个ruby钩子尽可能保持不变,尽管添加几行就可以了。

我假设stdin在本例中是一个管道。†

你不能倒带烟斗。您需要做的是将管道中的数据转换成一个常规文件,然后将该文件用作您正在调用的两个进程的stdin

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


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

#/usr/bin/ruby
需要“临时文件”
除非是File.File($stdin)
Tempfile.open('stdin')do | temp|
IO.copy_流($stdin,temp)
$stdin.重新打开(临时)
临时取消链接
结束
结束
ARGV.每个do | arg|
$stdin.rewind
系统参数
结束
用法示例(假设文件在当前目录中命名为
multiwrite
):

$echo foo |./多写cat'tr a-z a-z''tr a-z n-za-m'
福
福
sbb

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

它是一个git钩子,非常确定那是一个管道?我如何将stdin复制到脚本中的文件中?git hook是管道吗?我不知道,但我的脚本使它能够正确工作,无论它是否是管道。所以我所要做的就是删除最后一节,调用我的第一个脚本,然后倒带
$stdin.revend
,然后调用第二个脚本?差不多。试试看!如果它不起作用,在这里链接一个要点,我可以尝试调试。