对于任何命令,假装是 bash 中的 tty [重复]
Posted
技术标签:
【中文标题】对于任何命令,假装是 bash 中的 tty [重复]【英文标题】:Pretend to be a tty in bash for any command [duplicate] 【发布时间】:2015-12-30 20:52:59 【问题描述】:每当我使用grep
并将其通过管道传输到其他程序时,--color
选项都不会受到尊重。我知道我可以使用--color=always
,但它还提供了一些其他命令,我希望得到该命令的确切输出,就像我在 tty 中时得到的输出一样。
所以我的问题是,是否可以欺骗命令认为该命令在 tty 中运行?
比如跑步
grep --color word file # Outputs some colors
grep --color word file | cat # Doesn't output any colors
我希望能够写出类似的东西:
IS_TTY=TRUE grep --color word file | cat # Outputs some colors
This question 似乎有一个工具可以做我想做的事情:empty - run processes and applications under pseudo-terminal (PTY),但从我在文档中看到的内容来看,我不确定它是否能解决我的问题
【问题讨论】:
您意识到--color
改变了发送到命令的实际数据流吗?结果将破坏其他合理的代码,因为searchTarget
不是^[32;4gsearchTarget^[32;h
(或类似的)。祝你好运。
是的,我意识到,我将在我的脚本中永远不会使用该技术为 greps 着色,但我使用的某些命令在 tty 外部使用时似乎会输出不同的内容(例如 ag
, silversearcher,还有 mocha,...)而且我没有时间学习所有选项,只要我将这些命令传递给其他命令,就可以使用相同的格式打印)
嗯.. 我认为这之前已经提出了一些令人惊讶的答案(对我来说)。你搜索了很多[linux] (or) [bash] --color
吗?祝你好运。
我搜索了一下,但没有找到任何可以解决我的问题的东西。
你有没有试过这些:***.com/questions/1401002/…***.com/questions/4233808/…rachid.koucha.free.fr/tech_corner/pty_pdip.html
【参考方案1】:
有许多选项,正如其他几个 Stack Overflow 答案所述(请参阅 Caarlos 的 comment)。不过我会在这里总结一下:
使用script
+ printf
,不需要额外的依赖:
0<&- script -qefc "ls --color=auto" /dev/null | cat
或者做一个bash函数faketty
来封装:
faketty ()
script -qefc "$(printf "%q " "$@")"
faketty ls --color=auto | cat
或者在鱼壳里:
function faketty
script -qefc "(printf "%q " "$argv")"
end
faketty ls --color=auto | cat
(归功于answer)
http://linux.die.net/man/1/script
使用unbuffer
命令(作为expect
命令套件的一部分),不幸的是,这需要安装额外的软件包,但这是最简单的解决方案:
sudo apt-get install expect-dev # or brew install expect
unbuffer -p ls --color=auto | cat
或者如果你使用鱼壳:
function faketty
unbuffer -p $argv
end
faketty ls --color=auto | cat
http://linux.die.net/man/1/unbuffer
这是一篇关于 TTY 如何工作以及什么是 Pseudo-TTY (PTY) 的精彩文章,如果您想了解 linux shell 如何使用文件描述符来传递输入、输出和信号,那么值得一看. http://www.linusakesson.net/programming/tty/index.php
【讨论】:
将-e
添加到script
以返回命令的返回值。另外,考虑通过管道连接到less -FXur
,如果输出适合单个屏幕,它将显示颜色并且不执行任何操作(如果有,请修复 \r 问题)。
交换 c 和 e script -qfec "$(printf "%q " "$@")"
@StevieD 我刚刚遇到了同样的问题并进行了编辑以进行此更改。
查看***.com/a/60279429/1356047 了解适用于 Linux 和 MacO 并支持返回状态码的版本
写这个答案肯定有一段时间了,但我刚刚检查了archlinux上expect
的安装大小,不到1MB的一半以上是关于对于任何命令,假装是 bash 中的 tty [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中使用 TIOCSTI 将组合键注入 Bash tty