AS
Anthony Sottile commented
,第一个grep命令读取所有输入,检查
refs/for
. 你秒
grep
读取剩余的输入;从第一个输入开始读取
全部的
输入的内容中,没有剩余内容。因此第二个永远找不到任何东西。
你可以用很多不同的方法来处理这个问题。一种方法是将stdin复制到一个临时文件中,您可以反复读取该文件。另一种方法是构造钩子,使您只读取一次输入,检查每行的每个条件。第二种方法显然更有效,尽管这种“明显性”有点虚幻,这取决于我在这里不想讨论的细节。
不管怎样,我写这个的方式是:
#! /bin/sh
summary_status=0 # assume all OK initially
while read lref lhash rref rhash; do
case $rref in
refs/for/*|refs/draft/*) echo "push to $rref ok";;
*) echo "push to $rref not ok"; summary_status=1;;
esac
done
exit $summary_status
这种变体不需要bash特性(因此
/bin/sh
而不是
/bin/bash
在
#!
行);如果您将其更改为可以更改的,请确保更改
哎呀!
线。它只读取输入一次。它还验证您没有运行,例如:
git push remote master:refs/for/master develop
您的现有脚本将允许(因为一个正常,另一个不正常)。