tee到bash脚本中的日志,同时将stdout保留为TTY

时间:2013-02-27 05:01:22

标签: bash shell redirect stdout tee

redirect COPY of stdout to log file from within bash script itself类似,但我也希望将stdout保留为TTY设备。

例如,我有以下脚本:

/tmp/teed-off$ cat some-script
#!/usr/bin/env ruby

if $stdout.tty?
  puts "stdout is a TTY"
else
  puts "stdout is NOT a TTY"
end
/tmp/teed-off$ cat wrapper 
#!/usr/bin/env bash

exec > >(tee some-script.log)

./some-script

当我运行它们时,包装器将stdout作为TTY设备吃掉:

/tmp/teed-off$ ./some-script 
stdout is a TTY
/tmp/teed-off$ ./wrapper 
stdout is NOT a TTY

我怎样才能改变这种行为,以便脚本认为它在TTY中即使通过包装器执行也是如此?

2 个答案:

答案 0 :(得分:1)

它不会是微不足道的,但我认为你可以通过伪ttys来做到这一点。我不确定是否有任何标准工具(除了expect之外)可以为您完成。

需要一些思考。你有一个控制程序可以打开伪tty主机,然后打开从机。从站将连接到./some-script的输出。控制程序将读取主机,它将从主机读取的数据复制到文件和标准输出。

我没有尝试过编码。我不确定你是否可以使用标准的shell命令来做到这一点;我无法想到任何方式。所以,我认为会有一些C编码要做。

答案 1 :(得分:0)

查找dup2它复制文件描述符

  

int dup2(int oldfd,int newfd);