我的目的是将我的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
。