管道连接至T形时保留颜色


Answers:


84

只需unbuffer在任何命令之前插入,就可以认为它正在写入交互式输出,即使它实际上正在传递到另一个可执行文件中。如果使用,将保留颜色ls

例如

unbuffer ls -l --color=auto | tee output.log

如果尚未安装,则可以在Ubuntu和其他Debian-ish Linux发行版上进行安装unbuffer

sudo apt-get install expect-dev

6
另一种解决方案,它不需要安装任何东西,是stackoverflow.com/questions/3515208/...
TGR

3
这将导致结果文件包含颜色代码(当然);是否有任何方法可以使用颜色代码并在终端中正确显示颜色来打印文件?
Kyle Strand

2
糟糕,这会使密码输入以明文形式显示您的密码!
AndiDog 2015年

@Tgr在OS X上,该解决方案对我来说不起作用,试图获取原始的彩色输出xcodebuild-而是我切掉了没有颜色的行。 unbuffer xcodebuild | less -R完美地工作。
Slipp D. Thompson

2
您不需要expect-dev包装。expect足够。
Yajo

11

使用ls选项 --color=always

--color=auto 不会将输出颜色着色到管道-显而易见的原因。

主页上显示以下内容:

使用--color = auto时,仅在将标准输出连接到端子(tty)时才输出颜色代码。


2
好。这就解释了。但是我仍然可以以某种方式在屏幕上看到颜色吗?(毕竟是TTY)。我不介意不在日志文件中包含它们,但是我确实希望它们出现在屏幕上。
帕维尔Gościcki

我想我让自己不够清楚。ls -l只是一个例子。我有一个完全不同的命令(heroku日志),该命令在通过管道传递到时会剥离颜色tee。我想“修复/更改” Tee /管道,而不是我正在执行的命令。
帕维尔Gościcki

1
@Pawel,您无法轻松地将其固定在T形/管中,因为T形/管未剥离这些颜色代码。问题在于初始命令看到它没有写入终端。您需要一个伪终端,其作用类似于管道,但命令将其视为终端。
RedGrittyBrick 2011年

嗯...足够公平。我想我只需要接受事实就是如此。
帕维尔Gościcki

3
@PawełGościcki这个答案仅解决的问题ls。请参阅我的解决所有程序问题的答案,包括heroku日志。
Eamonn O'Brien-Strain 2014年

3

我将扩展script已接受答案的注释中给出的解决方案。script在您可能不想或不想安装包含命令的期望软件包的情况下,使用可能会有用unbuffer

使用颜色代码ls将输出打印到标准输出和文件:

script -efq output.log -c "ls -l --color=auto"

其中(man script):

  -e, --return
         Return the exit code of the child process.  Uses the same
         format as bash termination on signal termination exit code is 128+n.
  -f, --flush
         Flush output after each write.  This is nice for telecooperation:
        one person does `mkfifo foo; script -f foo', and another can 
        supervise real-time what is being done using `cat foo'.
  -q, --quiet
         Be quiet (do not write start and done messages to either 
         standard output or the typescript file).

查看带有颜色的输出文件:

less -r output.log

2
-e--return-不需要两者相同;-efq--return --flush --quiet
诺埃尔·马士基

@NoelMaersk谢谢。我在答案中包含了参数说明。
Juuso Ohtonen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.