如何从脚本本身重定向整个 ZSH shell 脚本的输出?

How to redirect output of an entire ZSH shell script from within script itself?

所以我想将非交互式 zsh shell 脚本的输出(stdout 和 stderr)记录到 stdout 和日志文件中,并从脚本本身配置该功能。

对于 bash 脚本,我使用了以下脚本并且效果很好:

#!/bin/bash
exec &> >(tee -a /path/to/logfile)

随后的所有内容都会打印到标准输出和日志文件。

但是当我将脚本更改为 运行 和 #!/bin/zsh 时,脚本将在到达 exec 行时挂起。

例如,如果脚本是这样的:

#!/bin/zsh
echo 'test'
exec &> >(tee -a /path/to/logfile)

然后当 运行ning 时,stdout 将挂起显示:

+test_script.sh:2> echo test

烦人的是,在挂起状态下,Ctrl-C 不会终止进程。我知道要重新控制我的终端的唯一方法是使用 Ctrl-Z 使进程后台运行,然后终止 pid。 (我花了一段时间才弄明白。)

无论如何,我想知道如何在 zsh 中实现相同的结果。理想情况下,我也很想了解为什么 zsh 的行为与 bash.

不同

谢谢!

我(终于)发现了一种与 bash 和 zsh 兼容的方法:

#!/bin/bash or #!/bin/zsh

exec > >(tee -a path/to/logfile) 2>&1

作为奖励,我还发现了如何在同一个脚本中将日志记录重定向更改为不同的文件。

#!/bin/bash or #!/bin/zsh

exec 3>&1
exec > >(tee -a path/to/logfile-1) 2>&1

echo "Copies stdout and stderr to first logfile"

exec >&3
exec > >(tee -a path/to/logfile-2) 2>&1

echo "Copies stdout and stderr to second logfile (and not the first)"

我承认我不完全理解为什么这有效,以及为什么 exec 的行为与我之前尝试的不同,但我现在使用这种方法没有任何问题。

感谢所有回复的人!