我想将标准输入重定向到多个脚本,以便测试开发中的 git 钩子(Hook),同时保留旧的钩子(Hook)。我知道我应该使用 tee
不知何故,我不知道如何使用基本的 >
, <
和管道|
bash 的重定向特性来做到这一点。此外,如何重定向脚本的标准输入?我不想使用 read
,因为它一次只读取一行,我必须为每一行重新执行所有子进程。
最佳答案
您可以将 tee 用于普通文件(可能是通过 mktemp
的临时文件),然后是 cat
这些文件到您的各种脚本。更直接地说,您可以用 mkfifo
创建的命名管道替换那些普通文件。 .但是您可以使用 Bash 强大的进程替换在一个管道中完成 >( cmd )
和 <( cmd )
替换文件的功能 tee
期望您的子流程。
使用 编辑:正如 chepner 指出的那样,默认情况下 tee 继承了 shell 的标准输入。<&0
获取脚本标准输入的第一个 tee。
最终结果是这个封装脚本:
#!/bin/bash
set +o pipefail
tee >(testscipt >> testscript.out.log 2>> testscript.err.log) | oldscript
一些注意事项:
- 使用
set +o pipefail
禁用 Bash 的 pipefail 功能(如果它之前已启用)。启用后,Bash 将从管道内报告错误。禁用时,它只会报告最后一个命令的错误,这就是我们在这里想让我们的测试脚本对包装器不可见的原因(我们希望它的行为就像它只是在调用 oldscript 以避免中断。 - 重定向测试脚本的标准输出,否则它将被转发到管道中的下一个命令,这可能不是您想要的。也可以重定向 stderr。
- 任意数量的
tee
s 可以像这样被管道链接以复制您的输入(但不要从初始的复制(初始的<&0
stdin 重定向)<&0
已被删除)
关于bash - 如何将标准输入 (stdin) 复制到 bash 脚本中的多个子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33403098/