首页 > 解决方案 > 复制标准输入的干净方法 - 供 git pre-push 使用?

问题描述

我想将标准输入传递给两个不同的进程。有哪些不错的干净方法可以做到这一点?

(我提出了一种基于临时文件的方法作为下面的答案,但也许有更好的方法?)

GitHub 的“git lfs pre-push”预推送挂钩读取标准输入。我想安装第二个预推送检查,例如我在 pre-push.sample 中找到的 WIP 检查。这意味着我需要以某种合理的方式保存标准输入,以便“git lfs pre-push”和“while read local_ref local_sha remote_ref remote_sha”循环都可以读取提交。

标签: gitshell

解决方案


您可以使用tee输出过程替换

在这里,为了清楚起见,我将单个检查代码放入函数中:

check1() {
  git lfs pre-push "$@"
}

check2() {
  while read -ra variables; do
    : ...
  done
}

# redirecting to /dev/null so you don't get the original input as well
tee >(check1) >(check2) >/dev/null

我不确定这些限制,但是您可以通过这种方式进行任意大量的检查:

tee >(check1) \
    >(check2) \
    >(check3) ...

一个演示:

check1() { while IFS= read -r n; do echo $((n*5)); done; }
check2() { while IFS= read -r line; do echo ">>>$line<<<"; done; }
seq 101 100 1101 | tee >(check1) >(check2) >/dev/null

输出

505
>>>101<<<
1005
1505
2005
2505
3005
3505
>>>201<<<
4005
4505
>>>301<<<
5005
>>>401<<<
5505
>>>501<<<
>>>601<<<
>>>701<<<
>>>801<<<
>>>901<<<
>>>1001<<<
>>>1101<<<

由于这两项检查都在子外壳中运行,因此输出顺序是不确定的。


推荐阅读