bash脚本使用像tee这样的文件描述符复制i / o

– – – – 编辑

我想将文件描述符同时路由到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”的章节.

点赞