Sha*_*ane 4 io bash logging file-descriptor tee
我想同时将文件描述符路由到多个位置。例如,我希望脚本中的每个命令都将stdout同时输出到/ dev / ps / 9和./myscript.stdout。我知道我可以在每一行之后使用tee来有效地执行此操作,但是有没有办法使用文件描述符来做到这一点?
如果您发现下面的伪代码使问题感到困惑,那么请忽略它,然后专注于上一段。我是昨天晚上在下面写下的东西,今天早上我什至发现它令人困惑。
exec 3>(tee /dev/ps/9 ./myscript.stdout)
exec 4>&1
exec 1>&3
Run Code Online (Sandbox Code Playgroud)
这里的一些代码...同时将stdout输出到终端和日志文件
exec 1>&4
exec 4>&-
exec 3>&-
Run Code Online (Sandbox Code Playgroud)
更多代码...正常运行
如果我的伪代码使问题变得比需要的更加混乱,我先向您道歉。如有疑问,请阅读我最近编辑的第一段,而忽略其余内容。
我希望脚本中的每个命令都将stdout同时输出到/ dev / ps / 9和./myscript.stdout。
exec 1> >(tee ./myscript.stdout >/dev/ps/9)
Run Code Online (Sandbox Code Playgroud)
上面结合了重定向和流程替换。仅使用重定向,就可以将标准输出发送到文件。例如:
exec 1> filename
Run Code Online (Sandbox Code Playgroud)
但是,使用bash时,文件名通常可以用命令替换。这称为流程替换,它看起来像>(some command)或<(some command)取决于是否要写入或读取流程。在我们的情况下,我们要写入tee命令。从而:
exec 1> >(some command)
Run Code Online (Sandbox Code Playgroud)
或者,更具体地说:
exec 1> >(tee ./myscript.stdout >/dev/ps/9)
Run Code Online (Sandbox Code Playgroud)
请注意,我们必须在redirect(1>)和进程替换(>(tee ./myscript.stdout >/dev/ps/9)。之间保持空格。如果没有该空格,则好像我们试图将其追加到名称以parens开头的文件,这会产生bash错误。
有关此的更多信息,请参见中的标题为“重定向”和“过程替换”的部分man bash。