与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中即使通过包装器执行也是如此?
答案 0 :(得分:1)
它不会是微不足道的,但我认为你可以通过伪ttys来做到这一点。我不确定是否有任何标准工具(除了expect
之外)可以为您完成。
需要一些思考。你有一个控制程序可以打开伪tty主机,然后打开从机。从站将连接到./some-script的输出。控制程序将读取主机,它将从主机读取的数据复制到文件和标准输出。
我没有尝试过编码。我不确定你是否可以使用标准的shell命令来做到这一点;我无法想到任何方式。所以,我认为会有一些C编码要做。
答案 1 :(得分:0)
查找dup2它复制文件描述符
int dup2(int oldfd,int newfd);