【发布时间】:2013-01-30 23:14:50
【问题描述】:
我正在尝试制作一个在控制台上吐出状态的脚本并制作一个日志文件。为此,我一直在我的 bash 脚本中使用以下行:
exec > >(tee logfile.txt)
让这一行有效地在控制台上显示标准输出并将其存储到 logfile.txt 中。现在我想同时捕获标准输出和标准错误。我尝试使用
exec 2>&1 >(tee logfile.txt)
这似乎不起作用。为什么?我怎样才能完成我的任务?
【问题讨论】:
我正在尝试制作一个在控制台上吐出状态的脚本并制作一个日志文件。为此,我一直在我的 bash 脚本中使用以下行:
exec > >(tee logfile.txt)
让这一行有效地在控制台上显示标准输出并将其存储到 logfile.txt 中。现在我想同时捕获标准输出和标准错误。我尝试使用
exec 2>&1 >(tee logfile.txt)
这似乎不起作用。为什么?我怎样才能完成我的任务?
【问题讨论】:
只需颠倒重定向的顺序。它可以帮助我从右到左阅读它们:
exec > >(tee logifle.txt) 2>&1
【讨论】:
tee 程序。然后2>&1 将标准错误发送到标准输出当前所在的位置(tee 程序)。问题中的代码首先执行2>&1,将标准错误发送到标准输出当前所在的位置,然后进行更改,以便标准输出进入tee 进程(但标准错误,文件描述符2,仍然会去控制台)
dup2(1, 2); - 它将文件描述符 1 复制为文件描述符 2 (stderr),因此 stdout 和 stderr是两个单独的文件描述符 (1, 2) 指向同一个文件(管道的写入端到tee 进程)。并且以相反的顺序,shell首先执行dup2(1, 2);,以便文件描述符2引用文件描述符1所引用的位置(但独立于文件描述符1),...[继续]
tee 进程的管道,而不更改文件描述符 2 指向的位置(这是控制台,因为这就是文件描述符 1 在进行 dup2() 调用时所指向的位置。