gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:13:53 27 4
gpt4 key购买 nike

我想将标准输入重定向到多个脚本,以便测试开发中的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com