首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有文件描述符的重复IO

带有文件描述符的重复IO
EN

Stack Overflow用户
提问于 2014-09-07 03:15:53
回答 3查看 4.3K关注 0票数 4

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

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

这段代码不起作用,但它是试图表达我的意图。为了稍后将stdout还原为FD 1,我将其复制到fd4中。

代码语言:javascript
复制
exec 3>(tee /dev/ps/9 ./myscript.stdout)
exec 4>&1
exec 1>&3

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

代码语言:javascript
复制
exec 1>&4
exec 4>&-
exec 3>&-
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-07 06:36:28

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

代码语言:javascript
复制
exec 1> >(tee ./myscript.stdout >/dev/ps/9)

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

代码语言:javascript
复制
exec 1> filename

但是,使用bash,文件名通常可以被命令替换。这被称为进程替换,它看起来类似于>(some command)<(some command),这取决于一个人是要写入还是从进程中读取。在我们的示例中,我们希望写入tee命令。因此:

代码语言:javascript
复制
exec 1> >(some command)

或者更具体地说:

代码语言:javascript
复制
exec 1> >(tee ./myscript.stdout >/dev/ps/9)

注意,我们必须维护重定向(1>)和进程替换(>(tee ./myscript.stdout >/dev/ps/9) )之间的空间。如果没有空格,我们就会试图添加到一个名以父文件开头的文件中,这将生成一个bash错误。

有关此问题的更多信息,请参见man bash中题为“重定向”和“进程替换”的部分。

票数 9
EN

Stack Overflow用户

发布于 2014-09-08 05:02:51

代码语言:javascript
复制
#!/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 1024

这里有一个脚本给任何想要测试这个的人。

有谁能给我详细解释一下高管的台词吗。

例如,为什么在箭头后面有一个空格:

代码语言:javascript
复制
exec 1> 
票数 0
EN

Stack Overflow用户

发布于 2014-09-07 20:07:36

代码语言:javascript
复制
#!/bin/bash
logfile=$$.log
exec > $logfile 2>&1 | tee
echo "test"

$$执行一个随机种子数,这是可选的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25706767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档