默认情况下,某些程序会根据它们写入的流的类型格式化其输出。例如,ls
和ls > file
的输出看起来不同。我想知道一个程序是如何实现的。另外,有没有一种方法可以欺骗这些程序,就好像输出流是一个实际上是文件的终端(特别是当它们没有任何影响输出格式的选项时)?
答案 0 :(得分:5)
通过isatty
:
if (!isatty(fileno(stdout))
{
// redirected to a file or piped to a process
}
欺骗的一种方法是启动script
而不是重定向。现在进入'tty'的所有内容(包括你输入stdin的内容以及发送到输出的内容)都被发送到一个名为typescript的文件。
答案 1 :(得分:2)
这些程序使用isatty(fileno(stdout))
来检查他们是否正在写入TTY(终端)或其他东西(例如管道)。
关于伪造tty,请检查Trick an application into thinking its stdin is interactive, not a pipe