欺骗一个应用程序,让它认为它的stdout是一个终端,而不是一个管道

我试图做相反的事情

检测标准输入是否是终端或管道?

我正在运行一个正在改变其输出格式的应用程序,因为它在stdout上检测到一个管道,我希望它认为它是一个交互式终端,以便在重定向时获得相同的输出。

我在考虑把它包装在一个expect脚本中,或者在PHP中使用proc_open()会做到这一点,但事实并非如此。

那里有任何想法?


啊哈!

script命令做我们想要的...

script --return -c "[executable string]" /dev/null

诀窍!


基于克里斯的解决方案,我想出了以下小帮手功能:

faketty() {
    script -qfc "$(printf "%q " "$@")" /dev/null
}

看起来很奇怪的printf对于在$@正确地扩展脚本参数是必要的,同时保护可能引用的命令部分(参见下面的示例)。

用法:

faketty <command> <args>

例:

$ python -c "import sys; print sys.stdout.isatty()"
True
$ python -c "import sys; print sys.stdout.isatty()" | cat
False
$ faketty python -c "import sys; print sys.stdout.isatty()" | cat
True

Expect附带的unbuffer脚本应该可以处理这个问题。 否则,应用程序可能会查看除输出连接的内容以外的内容,例如。 TERM环境变量设置为什么。

链接地址: http://www.djcxy.com/p/25289.html

上一篇: Trick an application into thinking its stdout is a terminal, not a pipe

下一篇: Use terminal command in ruby code?