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

时间:2018-03-27 09:33:46

标签: bash exec io-redirection

我的目的是让我的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 manualadvanced bash scripting中找到构建exec > >(command )的原因。你能解释一下它背后的逻辑吗?

1 个答案:

答案 0 :(得分:5)

>(tee $LOG_FILE)流程替换的示例,您可能希望搜索该内容。 Advanced Shell ScriptngBash manual

使用语法<(program)来捕获输出,>(program)用于输入输入,我们一次只能传输一条记录。它比命令替换(反引号或$( ))更强大,因为它替代文件名,而不是文本。因此,在通常指定文件的任何地方,我们都可以替换程序的标准输出或输入(尽管输入上的进程替换并不是那么常见)。 这在程序不使用标准流的情况下特别有用。

请注意,在您的示例中,您缺少空格,exec >>(tee $LOG_FILE) 2>&1 错误(您将收到语法错误),

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

是正确的,这个空间是至关重要的。

因此,exec >部分更改文件描述符1(默认值),也称为stdout标准输出,以引用&#34;无论下一步是什么& #34;,在这种情况下,它是进程替换,尽管通常它是文件名。

2>&1重定向文件描述符2,stderr标准错误以引用与文件描述符1相同的位置(如果省略&,则结束使用名为1)的文件。

完成后,您已经更改了当前进程的标准输出,因此后续命令的输出将转到tee进程。