【发布时间】:2015-02-06 18:32:07
【问题描述】:
有些程序会根据其标准输出是否为 tty 来更改其输出。因此,如果您将它们放入管道或重定向它们,则输出与您的外壳中的输出不同。这是一个例子:
$ touch a b c
# when running ls alone, it places them on one line
$ ls
a b c
# when stdout is not a tty, it places them on their own line
$ ls > output
$ cat output
a
b
c
output
所以,如果我想向某人展示这样的命令应该是什么样子(例如,我正在编写教程),我必须突出显示并复制终端的输出,然后将其保存到文件中。
看来我应该可以做这样的事情:
ls | ttypipe > output
ttypipe 是一个假设程序,当被问及它是否是 tty 时,它的标准输入(以及因此 ls 的标准输出)的响应为 true。
我知道在 Ruby 中,我可以做这样的事情:
require 'pty' # => true
IO.pipe.map(&:tty?) # => [false, false]
PTY.open.map(&:tty?) # => [true, true]
但这是针对子进程,而不是当前进程,因此:
$stdin.tty? # => false
我可以执行,我想不出影响标准输入文件描述符的方法。
【问题讨论】:
-
$stdin.tty?(什么都不需要,使用 IO#tty?)返回true。