对于任何命令,假装是 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ID:未找到命令-BASH:TTY:未找到命令

在 Python 中使用 TIOCSTI 将组合键注入 Bash tty

使用没有 tty 的 heredoc 在 ssh 后获取 bash 提示

将命令输出重定向到 bash 中的变量失败

docker常用命令

使用 bash 脚本批量重命名 FTP 服务器上的文件