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

标签 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 manual 中找不到构造 exec >>(command ) 的原因也不在advanced bash scripting .你能解释一下它背后的逻辑吗?

最佳答案

>(tee $LOG_FILE)进程替换的一个例子,您可能希望搜索它。 Advanced Shell ScriptngBash manual

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

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

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

是正确的,空间很重要。

因此,exec >部分更改文件描述符 1(默认值),也称为 stdout标准输出,指的是“接下来发生的事情”,在这种情况下它是进程替换,尽管通常它是一个文件名。

2>&1重定向文件描述符 2(stderr标准错误)以引用与文件描述符 1(stdout标准输出)相同的位置。 重要:如果您省略 &你最终得到一个名为 1 的文件而不是成功的重定向。

一旦您调用了 exec上面一行,那么你已经改变了当前进程的标准输出,所以后面命令的输出会转到tee处理而不是常规 stdout .

关于bash - 解释bash命令 "exec >>(tee $LOG_FILE) 2>&1",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49509264/

相关文章:

linux - shell脚本用空格连接两个字符串

bash - bash vi shell 模式下的 Tab 自动补全

linux - 为什么我的 bash 脚本在空白处中断?

php - 为 PHP exec() 方法传递交互式参数

bash - 重定向 stderr 会更改管道命令的退出代码

linux - 比较日期与 csh

php - 执行带有 "Program execution Functions"的二进制字符串(exec、system 等...)

java - 在 C++ 或 Java 中以响应模式使用 cmd

c++ - 文件重定向到程序

bash - 为什么 tee 无法写入标准输出?