– – – – 编辑
我想将文件描述符同时路由到MULTIPLE位置.例如,我希望我的脚本中的每个命令都能同时将stdout打印到/ dev / ps / 9和./myscript.stdout.我知道我可以在每一行之后使用tee来有效地做到这一点,但有没有办法用文件描述符做呢?
如果您发现下面的伪代码混淆了问题,那么忽略它并专注于前一段.我昨晚刚刚写下了这些东西,今天早上我甚至发现它令人困惑.
——–
exec 3>(tee /dev/ps/9 ./myscript.stdout)
exec 4>&1
exec 1>&3
这里有一些代码…同时将stdout输出到终端和日志文件
exec 1>&4
exec 4>&-
exec 3>&-
更多代码…正常运作
这里的关键是我不想在每一行代码之后使用tee
如果我的伪代码使问题比它需要的更令人困惑,我会提前道歉.如果有疑问,只需阅读我最近编辑的第一段,忽略其余部分.
最佳答案
I would like every command in my script to print stdout to /dev/ps/9
and ./myscript.stdout at the same time.
exec 1> >(tee ./myscript.stdout >/dev/ps/9)
以上结合了重定向和进程替换.单独使用重定向,可以将stdout发送到文件.例如:
exec 1> filename
但是,使用bash,文件名通常可以替换为命令.这称为进程替换,它看起来像>(某些命令)或<(某些命令),这取决于是否想要写入或读取进程.在我们的例子中,我们想写一个tee命令.从而:
exec 1> >(some command)
或者,更具体地说:
exec 1> >(tee ./myscript.stdout >/dev/ps/9)
请注意,我们必须保持重定向(1>)和进程替换(>(tee ./myscript.stdout> / dev / ps / 9)之间的空间.如果没有空格,看起来我们正在尝试附加到名称以parens开头的文件,这会产生bash错误.
有关详细信息,请参阅man bash中标题为“REDIRECTION”和“Process Substitution”的章节.