0

类似于从 bash 脚本本身将 stdout 的 COPY 重定向到日志文件,但我也想将 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 中?

4

2 回答 2

1

这不是微不足道的,但我认为你可以通过伪 tty 来做到这一点。我不确定是否有任何标准工具,除了也许expect,可以为你做这件事。

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

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

于 2013-02-27T05:35:31.663 回答
0

寻找 dup2 它复制了一个文件描述符

int dup2(int oldfd,int newfd);

于 2013-02-27T05:08:22.250 回答