具有文件描述符的IO重复



我想将文件描述符同时路由到多个位置。例如,我希望脚本中的每个命令都将stdout打印到/dev/ps/9和/myscript.stdout。

我希望实现类似的结果,将脚本(或脚本的一部分)中的每个命令管道传输到tee中,也许使用文件描述符。我还希望稍后能够在脚本中恢复默认输出行为。

这段代码不起作用,但它试图表达我的意图。为了稍后将stdout恢复为FD1,我将其复制到FD4中。

exec 3>(tee /dev/ps/9 ./myscript.stdout)
exec 4>&1
exec 1>&3

恢复正常输出行为,删除FD 3和4。

exec 1>&4
exec 4>&-
exec 3>&-

我希望脚本中的每个命令都将stdout打印到/dev/ps/9和/myscript.stdout。

exec 1> >(tee ./myscript.stdout >/dev/ps/9)

上面结合了重定向和进程替换。仅通过重定向,就可以将stdout发送到文件。例如:

exec 1> filename

但是,使用bash,文件名通常可以用命令替换。这被称为进程替换,它看起来像>(some command)<(some command),这取决于要向进程写入还是从进程读取。在我们的例子中,我们想要写入一个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"one_answers"Process Substitution"的部分。

#!/bin/bash
random=$$ # generate a random seed number to name the log files with
out=out.$random
err=err.$random
dev=`echo $(who -m) | cut -d' ' -f2` # for finding the right pseudo-terminal
: >$out # create the log files or empty their contents
: >$err # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
exec 1> >(tee ./$out >/dev/$dev) # I don't know how this works but it does
exec 2> >(tee ./$err >/dev/$dev) # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
echo # writing directly to the pts in /dev doesn't look right until sending a blank line
##########################################
echo 'hello'
for i in `seq 0 1 10`; do
    echo $i
done
bad_command

谢谢@John1024

这是一个脚本,供其他希望测试它的人使用。

有人能向我详细解释一下执行线路吗?

例如,为什么中的箭头后面有空格

exec 1> 

#!/bin/bash
logfile=$$.log
exec > $logfile 2>&1 | tee
echo "test"

$$进行随机种子编号,这是可选的。

相关内容

  • 没有找到相关文章

最新更新