bash - 如何将标准输入 (stdin) 复制到 bash 脚本中的多个子进程?

标签 bash shell io-redirection

我想将标准输入重定向到多个脚本,以便测试开发中的 git 钩子(Hook),同时保留旧的钩子(Hook)。我知道我应该使用 tee不知何故,我不知道如何使用基本的 > , <和管道| bash 的重定向特性来做到这一点。此外,如何重定向脚本的标准输入?我不想使用 read ,因为它一次只读取一行,我必须为每一行重新执行所有子进程。

最佳答案

您可以将 tee 用于普通文件(可能是通过 mktemp 的临时文件),然后是 cat这些文件到您的各种脚本。更直接地说,您可以用 mkfifo 创建的命名管道替换那些普通文件。 .但是您可以使用 Bash 强大的进程替换在一个管道中完成 >( cmd )<( cmd )替换文件的功能 tee期望您的子流程。

使用 <&0获取脚本标准输入的第一个 tee。 编辑:正如 chepner 指出的那样,默认情况下 tee 继承了 shell 的标准输入。

最终结果是这个封装脚本:

#!/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/

相关文章:

string - 在 bash 中将字符串转换为日期

bash - 使用 bash 脚本操作文件

c - 创建子进程时重定向输出问题。在 POSIX 中编写自己的 Shell

bash - 后台进程重定向到 COPROC

linux - 列出目录(和子目录)中的所有文件(带完整路径),按访问时间排序

bash - 如何在 bash 中向文本文件中一行的所有条目添加常量

linux - 使用 shell 脚本遍历 $PATH 变量

c - 将标准错误重定向到 C 中的字符串

bash - 在 bash 中创建一个文件,如果无法创建,我该如何使用 2>/dev/null?

node.js - 如何快速执行终端命令?