ls命令减少了彩色输出


21

如果我运行,ls我将获得彩色输出,对于快速浏览文件类型,我发现它非常方便。当我尝试less使用-r-R标志将其传递到偶数时,颜色总是会丢失。我正在使用zsh5.0.7版。有任何想法吗?谢谢。

编辑:我在OS X上。


您可以确认ls正在调用--color吗?尝试暂停管道(^Z)或ps从另一个终端使用。which ls产生什么输出?
zackse

我清除这个从接近队列,因为OP已经明确表示,他们正在使用less -r,所以它不是有问题,less而是ls
terdon

我很惊讶这还不是重复的,但是我能找到的最接近的是将命令输出存储在variable中,并且在Super User上。
斯科特,

@Scott我不确定是否有确切的重复项,但是有些问题的答案非常相似(ls结果取决于stdout)。我记得的是unix.stackexchange.com/questions/157285/…,它本身被标记为unix.stackexchange.com/questions/10421/…的副本
jimmij 2015年

@jimmij但是这些问题没有提到,这ls --color=auto意味着仅在写入终端时(即,标准输出是终端时)使用颜色,而不是在文件或管道时才使用颜色。
斯科特,

Answers:


21

这是设计使然的:产生彩色输出的程序通常仅在其输出到达终端时才这样做,而不是在将其发送到管道或常规文件时才这样做。原因是终端上发送的数据大概是人类读取的,而通过管道传输到程序或写入文件的数据很可能会被某些程序解析,因此它不应包含多余的内容,例如变色转义序列。

ls传递选项--color(或--color=auto)时,GNU 在终端上显示彩色输出。要强制彩色输出而不管标准输出的文件类型如何,请通过--color=always--color=yes(它们是同义词)。其他命令(例如GNU grep,FreeBSD grep git diff等)遵循此约定。

ls --colors=yes -l | less

使用FreeBSD版本ls(也可以在OSX上找到,并且可以colorls在OpenBSD和NetBSD上作为端口使用),传递选项-G以在输出是终端时显示颜色。设置环境CLICOLOR_FORCE以显示颜色,而不管输出文件的类型如何。

CLICOLOR_FORCE=1 ls -l | less

20

问题很可能是您的ls程序具有set选项--color=auto,这基本上意味着仅在将输出连接到终端时才对输出进行着色,否则(输出连接到管道或文件)不会发出颜色。

如果您想使用这种颜色,则应将--coloroption 设置为always,因此请尝试

ls --color=always | less -R

如果这种行为一直是您期望的,那么只需创建别名即可:

alias ls='ls --color=always'

在我的设置中,bash 4.3版是--color是一个非法选项。抓“ color”会告诉我有关“ -G”选项的信息,但对于自动或始终选项却什么也没说。有任何想法吗?
nunos 2015年

5
@nunos ls不是来自bash,它是独立程序。运行ls --version以检查其版本。我的是ls GNU coreutils)8.21
jimmij 2015年

@jimiij我的ls版本没有--version标志。我正在使用OS X的默认设置,不确定是否有帮助。
nunos

@nunos请始终提及您的操作系统。Linux和非GNU nix(例如OSX)之间存在巨大差异。
terdon

0

我无法评论@jimmij的答案,因为我的代表人数不到50,但是我想解释一下Bash对我有用的东西。

如果你跑

$ man ls | grep color

您将看到man针对特定Shell环境的-page的所有条目(在我们的示例中bash)。

对我来说,以下调整可以解决问题:

$ alias ls='ls -G'

3
那是为了什么?该-G标志与如何ls管理其彩色输出无关。这样只会从中删除组ls -l。它确实会影响BSD ls(以及OSX中使用的一种)的颜色输出,这是您的意思吗?无论如何,我认为重定向到文件时不会显示颜色,而只会在命令行显示颜色。
terdon
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.