解释 bash 命令"exec > >(tee $LOG_FILE) 2>&1"



我的目的是将我的bash脚本的所有输出显示在控制台上并登录到文件。

这是我的脚本,它可以按预期工作。

#!/bin/bash
LOG_FILE="test_log.log"
touch $LOG_FILE
# output to console and to logfile
exec > >(tee $LOG_FILE) 2>&1
echo "Starting command ls"
ls -al
echo "End of script"

但是我不明白为什么它是这样工作的。

我期望exec >>(tee $LOG_FILE) 2>&1工作,但尽管exec >>$LOG_FILE 2>&1确实有效,但它会失败。

我找不到在bash手册中或高级bash脚本中构造exec > >(command )的原因。您能解释其背后的逻辑吗?

>(tee $LOG_FILE) process替代的示例,您可能希望搜索它。高级Shell Scriptng和Bash手册

使用语法,<(program)用于捕获输出,>(program)用于进食输入,我们可以一次只传递一个记录。它比命令替代(Backticks或$( )(更强大,因为它替换为a fileName 而不是文本。因此,通常指定文件的任何地方,我们都可以替换程序的标准输出或输入(尽管输入上的过程替换并不是这么常见(。当程序不为您想要的标准流使用标准流时,这特别有用。

请注意,在您的示例中,您缺少一个空间,exec >>(tee $LOG_FILE) 2>&1错误(您将获得语法错误(。相反,

exec > >(tee $LOG_FILE) 2>&1

是正确的,该空间很关键。

因此,exec >零件更改文件描述符1(默认值(,也称为stdout标准输出,请参考" Next&quot",在这种情况下,这是过程替换,尽管通常是一个文件名。

2>&1重定向文件描述符2(stderr标准错误(,请参考与文件描述符1(stdout standard out (相同的位置。重要:如果省略了&,则使用称为1而不是成功重定向的文件最终。

一旦调用了上面的exec行,就更改了当前过程的标准输出,因此从命令输出的输出转到该tee进程而不是常规stdout

最新更新