Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash中重定向嵌套函数调用的输出?_Bash_Pipe - Fatal编程技术网

如何在bash中重定向嵌套函数调用的输出?

如何在bash中重定向嵌套函数调用的输出?,bash,pipe,Bash,Pipe,我有一个bash脚本,它有几个函数,这些函数都在一个函数中调用。如何将所有函数的所有输出连接到主函数?我还将使用tee将输出显示到term和日志文件 func 1 func 2 func 3 func 1 func 4 func 2 func 3 call func 4 # i want to grab it here 正如DigitalRoss所说,所有stdout都位于同一个位置,无论函数和脚本嵌套的深度如何(达到系统限制),管道和T形三通都可以工作。在

我有一个bash脚本,它有几个函数,这些函数都在一个函数中调用。如何将所有函数的所有输出连接到主函数?我还将使用tee将输出显示到term和日志文件

func 1

func 2

func 3
    func 1

func 4 
    func 2
    func 3


call func 4 # i want to grab it here

正如DigitalRoss所说,所有stdout都位于同一个位置,无论函数和脚本嵌套的深度如何(达到系统限制),管道和T形三通都可以工作。在下面的演示中,函数
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

嗯,当有疑问时,使用
()
,它将运行子shell并重定向其整个输出

因此,尝试以下方法:

( mytoplevelfunc ) | tee whatever
即使是真正的嵌套重定向也可以工作

(不仅仅是
()
,即使是
{}
)我也很难理解这个问题。无论涉及多少shell函数或实命令,输出都会转到标准输出或标准错误。您已经可以将其从“主管道”导入管道。将shell函数的输出“管道化”到主函数意味着什么?好吧,我使用tee来记录输出并按术语显示它。问题是,其中一个函数调用外部脚本,并且没有记录任何输出。我能够记录它的唯一方法是,如果我在对脚本的一个特定调用上引导和tee输出。如果我尝试在两个位置都登录,文件会被锁定并且无法正常工作。我想这就是我要找的。谢谢
$ { echo aaaa; echo bbbb >/tmp/x; echo cccc; } >/tmp/y
$ cat x
bbbb
$ cat y
aaaa
cccc