如何为 Linux 下的命令设置色彩输出? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
tlmn
V2EX    程序员

如何为 Linux 下的命令设置色彩输出?

  •  
  •   tlmn 2022-05-21 02:08:33 +08:00 2593 次点击
    这是一个创建于 1246 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 使用 --color=auto 进行设置,但部分程序并不支持此选项,通用型很弱。
    2. https://unix.stackexchange.com/questions/148/colorizing-your-terminal-and-shell-environment 中提到的 TERM=xterm-color 在 ubuntu 服务器上未测试成功。

    是否有办法能够兼容大部分情况下实现 /bin/bash -c ls 这条命令的色彩输出?

    21 条回复    2022-05-27 10:38:14 +08:00
    saleacy
        1
    saleacy  
       2022-05-21 02:10:20 +08:00 via Android
    | lolcat
    tlmn
        2
    tlmn  
    OP
       2022-05-21 02:14:04 +08:00
    @saleacy 刚刚测试了一下,这种方式确实能够实现命令输出,但不是理想的效果,原因有二:

    1. 此命令在大多数操作系统中不是内置命令,需要安装
    2. 输出的颜色过于诡异,不符合预期
    Buges
        3
    Buges  
       2022-05-21 02:53:33 +08:00 via Android
    写一个 LD_PRELOAD 的库,覆盖 isatty 这个函数永远返回 1 , 这样程序就会认为输出的是终端,一般就会默认带颜色输出。
    Buges
        4
    Buges  
       2022-05-21 02:55:12 +08:00 via Android
    关于终端方面的,推荐 这篇文章看一看
    https://fasterthanli.me/articles/a-terminal-case-of-linux
    julyclyde
        5
    julyclyde  
       2022-05-21 16:13:06 +08:00
    本来不支持,你用了外挂让它支持,还抱怨支持的不好?
    zhaoyeye
        6
    zhaoyeye  
       2022-05-22 02:10:22 +08:00 via Android
    为什么要带颜色啊!我就喜欢黑底白字的那种,眼睛舒服
    tlmn
        7
    tlmn  
    OP
       2022-05-22 12:16:00 +08:00
    @Buges 感谢,您说的这个方案可以使得命令行执行命令着色,是否还有成本更低的解决方案?
    tlmn
        8
    tlmn  
    OP
       2022-05-22 12:16:36 +08:00
    @julyclyde 终端是否支持颜色是看终端类型的,目前大部分终端均支持颜色的输出,不知道何来“本不支持”一说?
    tlmn
        9
    tlmn  
    OP
       2022-05-22 12:17:22 +08:00
    @zhaoyeye 因为正确的着色可以提高效率,一个简单的例子,你执行 ls 之后,如果没有色彩辅助,如何第一时间判断哪些是目录哪些是文件,以及哪些是可执行文件哪些是正常文件。
    Buges
        10
    Buges  
       2022-05-22 14:06:39 +08:00 via Android
    @tlmn 这成本还高?创建一个 lib.c ,内容如下:
    int isatty() {
    return 1;
    }
    然后编译 gcc -shared lib.c -o lib.so
    加载使用:
    LD_PRELOAD=./lib.so ls --color=auto | cat
    就可以看到彩色输出了。
    ganymede
        11
    ganymede  
       2022-05-22 16:42:17 +08:00
    试试 vivid A themeable LS_COLORS generator with a rich filetype datebase
    https://github.com/sharkdp/vivid
    tlmn
        12
    tlmn  
    OP
       2022-05-22 18:38:02 +08:00
    @Buges 成本高指的是具有侵入性而不是使用成本哈,另外你试试 LD_PRELOAD=./lib.so /bin/bash -c ls --color=auto | cat 是否可行呢
    Buges
        13
    Buges  
       2022-05-22 20:57:13 +08:00 via Android
    @tlmn
    LD_PRELOAD=./lib.so bash -c "ls --color=auto" | cat
    是可行的,如果你不加引号第二个参数会被 bash 解析。
    实际上只需要为需要强制输出颜色的命令设置环境变量就可以了,不需要大范围的劫持。你甚至可以再完善一下,在除特定情况外正常调用 libc 的 isatty 函数。
    不过这种方式对静态链接的程序不适用。
    julyclyde
        14
    julyclyde  
       2022-05-23 12:51:56 +08:00
    @tlmn 说的是输出信息的程序“本不支持”
    julyclyde
        15
    julyclyde  
       2022-05-23 12:52:39 +08:00
    @tlmn ls 不开颜色的话,看第一位是不是 d 就知道是不是目录了
    tlmn
        16
    tlmn  
    OP
       2022-05-24 01:10:50 +08:00
    @julyclyde 你有试想过一个文件夹中成千个不同类型的文件下用你这个方法最终产生的结果吗
    tlmn
        17
    tlmn  
    OP
       2022-05-24 01:11:07 +08:00
    @Buges 好的,确实可行,作为备选方案
    tlmn
        18
    tlmn  
    OP
       2022-05-24 01:12:17 +08:00
    @Buges 奇怪,我如果劫持了这个函数,为什么还需要添加 --color 呢?
    Buges
        19
    Buges  
       2022-05-24 01:39:36 +08:00 via Android
    @tlmn --color=auto 的意思是让 ls 命令自动检测输出是否为 tty ,是则带颜色,不是则不带(并且格式也不一样)。
    而上面的劫持是强制让程序认为输出目标为 tty 。
    常规来说 ls 默认就是--color=auto 的,但也可能你调用的 ls 不是 /usr/bin/ls ,而是 shell 覆盖定义的函数或 alias ,从而自带了一些参数可能改变默认行为。
    所以这里显式指定,一方面避免可能的干扰,另一方面更清晰地表达出这个劫持的作用:即欺骗程序对自动颜色输出的检测。
    tlmn
        20
    tlmn  
    OP
       2022-05-24 23:00:43 +08:00
    @Buges 好的,谢谢您
    flynaj
        21
    flynaj  
       2022-05-27 10:38:14 +08:00
    linux 终端的彩色是要程序本身支持才行的。基本上这个功能是调用 libncurses 来实现的。一个是要看程序有没有调用 libncurses ,另外还要看编译的时候有没有把这个功能关了。 很多编译出来的 busybox 为了小巧都是把这个功能关了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1233 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 17:37 PVG 01:37 LAX 10:37 JFK 13:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86