【问题标题】:How do I redirect output of nested function calls in bash?如何在 bash 中重定向嵌套函数调用的输出?
【发布时间】:2026-02-17 05:40:01
【问题描述】:

我有一个 bash 脚本,其中有几个函数都在 1 个函数中调用。如何将所有功能的所有输出通过管道传输到主要功能?我还将使用 tee 将输出显示到术语和日志文件。

func 1

func 2

func 3
    func 1

func 4 
    func 2
    func 3


call func 4 # i want to grab it here

【问题讨论】:

  • 我很难理解这个问题。无论涉及多少 shell 函数或实际命令,输出都会转到标准输出或标准错误。您已经可以将它从“主要”引导到管道中。将 shell 函数的输出“输送到主函数”甚至意味着什么?
  • 好吧,我使用 tee 来记录输出并按术语显示。问题是,其中一个函数调用了一个外部脚本,并且没有记录任何输出。我能够记录它的唯一方法是,如果我在对脚本的特定调用中直接输出并发送输出。如果我尝试在这两个位置记录它,则文件被锁定并且无法正常工作。

标签: bash pipe


【解决方案1】:

嗯,如果有疑问,请使用 ( ),它将运行一个子 shell 并重定向其整个输出。

所以,试试这样的:

( mytoplevelfunc ) | tee whatever

【讨论】:

  • 我想这就是我想要的。谢谢!
【解决方案2】:

正如 DigitalRoss 所说,无论函数和脚本嵌套的深度如何(直至系统限制),所有标准输出都位于同一个位置,并且管道和 teeing 工作正常。在下面的演示中,函数f4 演示了一种实现方式,f5 演示了另一种方式。

$ f1 () { echo f1; }
$ f2 () { echo f2; }
$ f3 () { echo f3; f1; }
$ f4 () { echo f4; f2; f3; }
$ f4
f4
f2
f3
f1
$ f4 | tee tee.out
f4
f2
f3
f1
$ cat tee.out
f4
f2
f3
f1
$ f5 () { { echo f4; f2; f3; } | tee tee2.out; }
$ f4 | tee tee.out
f4
f2
f3
f1
$ cat tee.out
f4
f2
f3
f1

【讨论】:

    【解决方案3】:
    $ { echo aaaa; echo bbbb >/tmp/x; echo cccc; } >/tmp/y
    $ cat x
    bbbb
    $ cat y
    aaaa
    cccc
    

    即使是真正的嵌套重定向也有效
    (不仅是(),甚至是{}

    【讨论】: