解释bash命令"exec > >(tee $LOG_FILE) 2>&1"
Explain the bash command "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 manual nor in advanced bash scripting中找不到构造exec > >(command )
的原因。你能解释一下背后的逻辑吗?
>(tee $LOG_FILE)
是 进程替换 的示例,您可能希望搜索它。 Advanced Shell Scriptng and Bash manual
使用语法,<(program)
用于捕获输出,>(program)
用于提供输入,我们可以一次只传递一条记录。它比命令替换(反引号或 $( )
)更强大,因为它替换的是 文件名 ,而不是文本。因此,在通常指定文件的任何地方,我们都可以替换程序的标准输出或输入(尽管对输入的进程替换并不那么常见)。
这在程序不使用标准流来满足您的需求时特别有用。
请注意,在您的示例中,您缺少一个 space,exec >>(tee $LOG_FILE) 2>&1
是 错误的 (您将收到语法错误),
exec > >(tee $LOG_FILE) 2>&1
是正确的,space 很关键。
因此,exec >
部分更改文件描述符 1(默认值),也称为 stdout
或 标准输出 ,以引用 "whatever comes next",在这种情况下它是进程替换,尽管通常它是一个文件名。
2>&1
重定向文件描述符 2,stderr
或 标准错误 指向与文件描述符 1 相同的位置(如果省略 &
你 end-up 有一个名为 1
).
的文件
完成后,您就更改了当前进程的标准输出,因此后续命令的输出将转到 tee
进程。
我的意图是让我的 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 nor in advanced bash scripting中找不到构造exec > >(command )
的原因。你能解释一下背后的逻辑吗?
>(tee $LOG_FILE)
是 进程替换 的示例,您可能希望搜索它。 Advanced Shell Scriptng and Bash manual
使用语法,<(program)
用于捕获输出,>(program)
用于提供输入,我们可以一次只传递一条记录。它比命令替换(反引号或 $( )
)更强大,因为它替换的是 文件名 ,而不是文本。因此,在通常指定文件的任何地方,我们都可以替换程序的标准输出或输入(尽管对输入的进程替换并不那么常见)。
这在程序不使用标准流来满足您的需求时特别有用。
请注意,在您的示例中,您缺少一个 space,exec >>(tee $LOG_FILE) 2>&1
是 错误的 (您将收到语法错误),
exec > >(tee $LOG_FILE) 2>&1
是正确的,space 很关键。
因此,exec >
部分更改文件描述符 1(默认值),也称为 stdout
或 标准输出 ,以引用 "whatever comes next",在这种情况下它是进程替换,尽管通常它是一个文件名。
2>&1
重定向文件描述符 2,stderr
或 标准错误 指向与文件描述符 1 相同的位置(如果省略 &
你 end-up 有一个名为 1
).
完成后,您就更改了当前进程的标准输出,因此后续命令的输出将转到 tee
进程。