假装在任何命令的bash中都是tty

edi*_*999 21 bash tty

每当我使用grep,并将其管道到其他程序时,该--color选项不受尊重.我知道我可以使用--color=always,但它也提出了一些其他命令,我想得到该命令的确切输出,如果我在tty中我将得到的输出.

所以我的问题是,是否有可能欺骗命令认为命令是在tty内运行的?

例如,跑步

grep --color word file # Outputs some colors
grep --color word file | cat # Doesn't output any colors
Run Code Online (Sandbox Code Playgroud)

我希望能够写出类似的东西:

IS_TTY=TRUE grep --color word file | cat  # Outputs some colors
Run Code Online (Sandbox Code Playgroud)

这个问题似乎有一个工具,可能会做我想要的:空 - 在伪终端(PTY)下运行进程和应用程序,但从我在文档中读到的,我不确定它可以帮助我的问题

Nic*_*ing 19

有许多选项,如其他几个Stack Overflow答案所述(参见Caarlos评论).我会在这里总结一下:

  1. 使用script+printf,不需要额外的依赖:

    0<&- script -qefc "ls --color=auto" /dev/null | cat
    
    Run Code Online (Sandbox Code Playgroud)

    或者使用bash函数faketty来封装它:

    faketty () {
        script -qfce "$(printf "%q " "$@")"
    }
    faketty ls --color=auto | cat  
    
    Run Code Online (Sandbox Code Playgroud)

    或者在鱼壳中:

    function faketty
        script -qefc "(printf "%q " "$argv")"
    end
    faketty ls --color=auto | cat 
    
    Run Code Online (Sandbox Code Playgroud)

    (功劳归于这个答案)

    http://linux.die.net/man/1/script

  2. 使用该unbuffer命令(作为expect命令套件的一部分),遗憾的是这需要50mb +安装,但这是最简单的解决方案:

    sudo apt-get install expect-dev
    unbuffer -p ls --color=auto | cat  
    
    Run Code Online (Sandbox Code Playgroud)

    或者如果你使用鱼壳:

    function faketty
        unbuffer -p $argv
    end
    faketty ls --color=auto | cat 
    
    Run Code Online (Sandbox Code Playgroud)

    http://linux.die.net/man/1/unbuffer

这是一篇关于TTY如何工作以及伪TTY(PTY)是什么的伟大文章,如果你想了解linux shell如何使用文件描述符来传递输入,输出和信号,那么值得一看.http://www.linusakesson.net/programming/tty/index.php

  • 将`-e`添加到`script`以返回命令的返回值.另外,考虑使用"less -FXur"的管道,它将显示颜色,如果输出适合单个屏幕,则不做任何事情(如果你有它,则修复\ r \n问题). (2认同)
  • 交换c和e`script -qfec“ $(printf”%q“” $ @“)”` (2认同)
  • 请参阅 /sf/answers/4219560061/,了解适用于 Linux 和 MacO 并支持返回状态代码的版本 (2认同)