更改 LS_COLORS 行为

更改 LS_COLORS 行为

我正在尝试改变LS_COLORS行为。目前,它(例如 forshpy)会根据它是否可执行而改变颜色,如下所示 我的终端截图;一个是可执行的,另一个则不可

但是,我希望我的所有脚本,无论是否可执行,都具有相同的颜色和计算机生成的可执行文件,例如a.out等具有由 ex 在 LS_COLOR 中定义的颜色

这是以下的输出dircolors -p

# Configuration file for dircolors, a utility to help you set the
# LS_COLORS environment variable used by GNU ls with the --color option.
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
# Copying and distribution of this file, with or without modification,
# are permitted provided the copyright notice and this notice are preserved.
# The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the
# slackware version of dircolors) are recognized but ignored.
# Below, there should be one TERM entry for each termtype that is colorizable
TERM Eterm
TERM ansi
TERM color-xterm
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM cons25
TERM console
TERM cygwin
TERM dtterm
TERM eterm-color
TERM gnome
TERM gnome-256color
TERM hurd
TERM jfbterm
TERM konsole
TERM kterm
TERM linux
TERM linux-c
TERM mach-color
TERM mach-gnu-color
TERM mlterm
TERM putty
TERM putty-256color
TERM rxvt
TERM rxvt-256color
TERM rxvt-cygwin
TERM rxvt-cygwin-native
TERM rxvt-unicode
TERM rxvt-unicode-256color
TERM rxvt-unicode256
TERM screen
TERM screen-256color
TERM screen-256color-bce
TERM screen-bce
TERM screen-w
TERM screen.Eterm
TERM screen.rxvt
TERM screen.linux
TERM st
TERM st-256color
TERM terminator
TERM vt100
TERM xterm
TERM xterm-16color
TERM xterm-256color
TERM xterm-88color
TERM xterm-color
TERM xterm-debian
# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
#NORMAL 00 # no color code at all
#FILE 00 # regular file: use no color at all
RESET 0 # reset to "normal" color
DIR 01;34 # directory
LINK 01;36 # symbolic link. (If you set this to 'target' instead of a
 # numerical value, the color is as for the file pointed to.)
MULTIHARDLINK 00 # regular file with more than one link
FIFO 40;33 # pipe
SOCK 01;35 # socket
DOOR 01;35 # door
BLK 40;33;01 # block device driver
CHR 40;33;01 # character device driver
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file
SETUID 37;41 # file that is setuid (u+s)
SETGID 30;43 # file that is setgid (g+s)
CAPABILITY 30;41 # file with capability
STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w)
OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky
STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable
# This is for files with execute permission:
EXEC 01;32
# List any file extensions like '.gz' or '.tar' that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a '#')
# If you use DOS-style suffixes, you may want to uncomment the following:
#.cmd 01;32 # executables (bright green)
#.exe 01;32
#.com 01;32
#.btm 01;32
#.bat 01;32
# Or if you want to colorize scripts even if they do not have the
# executable bit actually set.
#.sh 01;32
#.csh 01;32
 # archives or compressed (bright red)
.tar 01;31
.tgz 01;31
.arc 01;31
.arj 01;31
.taz 01;31
.lha 01;31
.lz4 01;31
.lzh 01;31
.lzma 01;31
.tlz 01;31
.txz 01;31
.tzo 01;31
.t7z 01;31
.zip 01;31
.z 01;31
.Z 01;31
.dz 01;31
.gz 01;31
.lrz 01;31
.lz 01;31
.lzo 01;31
.xz 01;31
.bz2 01;31
.bz 01;31
.tbz 01;31
.tbz2 01;31
.tz 01;31
.deb 01;31
.rpm 01;31
.jar 01;31
.war 01;31
.ear 01;31
.sar 01;31
.rar 01;31
.alz 01;31
.ace 01;31
.zoo 01;31
.cpio 01;31
.7z 01;31
.rz 01;31
.cab 01;31
# image formats
.jpg 01;35
.jpeg 01;35
.gif 01;35
.bmp 01;35
.pbm 01;35
.pgm 01;35
.ppm 01;35
.tga 01;35
.xbm 01;35
.xpm 01;35
.tif 01;35
.tiff 01;35
.png 01;35
.svg 01;35
.svgz 01;35
.mng 01;35
.pcx 01;35
.mov 01;35
.mpg 01;35
.mpeg 01;35
.m2v 01;35
.mkv 01;35
.webm 01;35
.ogm 01;35
.mp4 01;35
.m4v 01;35
.mp4v 01;35
.vob 01;35
.qt 01;35
.nuv 01;35
.wmv 01;35
.asf 01;35
.rm 01;35
.rmvb 01;35
.flc 01;35
.avi 01;35
.fli 01;35
.flv 01;35
.gl 01;35
.dl 01;35
.xcf 01;35
.xwd 01;35
.yuv 01;35
.cgm 01;35
.emf 01;35
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
.axv 01;35
.anx 01;35
.ogv 01;35
.ogx 01;35
# audio formats
.aac 00;36
.au 00;36
.flac 00;36
.m4a 00;36
.mid 00;36
.midi 00;36
.mka 00;36
.mp3 00;36
.mpc 00;36
.ogg 00;36
.ra 00;36
.wav 00;36
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
.axa 00;36
.oga 00;36
.spx 00;36
.xspf 00;36

我也在LS_COLORS我的设置~/.bashrc

  LS_COLORS='no=1:di=1;38;2;66;133;244:ln=09;32:pi=40;32:so=01;35:bd=40;33;01:cd=34;33;01:or=34;33;01:ex=01;38;2;149;138;221:*.in=01;34:*.sh=1;38;2;0;215;95'

正如您在图像中看到的,当rename.sh设置为可执行文件时,ex 颜色将覆盖 sh 文件类型的颜色。

答案1

为了实用,您始终可以ls用一个小的 shell 函数替换您,该函数对 的输出进行后处理lsls通常已经是一个 shell 别名(参见 use: type ls)。尽管您可以对函数使用相同的名称,但最好使用稍微不同的名称,ll以避免任何歧义。您很快就会习惯输入 ll 而不是 ls。

这是这样一个 shell 函数(例如将其放入 ~/.bash_profile 中)。它使用 perl 查找 ansi 转义代码序列,这些序列设置以 结尾的文件名周围的颜色.sh,并将它们替换为您想要的序列。您可以通过管道输出来查看这些ls --color代码cat -vet。如果您没有看到与我相同的序列,您可能需要编辑此脚本。另外,ls 可能不会做出相同的反应,因为输出是管道而不是 tty。

ll(){
    /bin/ls --color "$@" |
    perl -p -e '$want = "1;38;2;0;215;95";
                s/(\e\[)([0-9;]*)(m[^\e]*\.sh\e\[0m$)/$1$want$3/;' 
}

在perl替换命令中(s/pattern/replacement string/)\e是转义字符,\[是左括号([),[0-9;]*是任何数字序列和(;),[^\e]*是不包括转义的任何字符,\.是点(.) ,并且$是该行的末尾。()用于将匹配零件捕获到$1、$2和$3中,用于替换零件。

如果您确实想要该名称ls,请保留该函数ll并使用alias ls=ll它,使其仅在交互式 shell 中有效。

答案2

尽管这个问题已经很老了,但我仍然通过修改并重新编译我的ls.以下是一些额外的细节:

操作系统:Kubuntu 23.04(Ubuntu 变体) coreutils版本:9.1

在深入研究源代码后,我了解到的是,仅ls检查LS_COLORS特定扩展名是否是普通文件,而不是可执行文件。我刚刚修改了它ls以允许它对可执行文件执行相同的颜色检查。

步骤如下:

  1. (确保您启用了 deb-src 存储库)
sudo apt install build-essential
sudo apt-get build-dep coreutils
apt-get source coreutils
cd coreutils-9.1

您可能需要cd根据您的 coreutils 版本更改命令。

  1. 使用任何编辑器打开src/ls.c.搜索这些行:
...
/* Check the file's suffix only if still classified as C_FILE.  */
ext = NULL;
if (type == C_FILE)
    {
...

要修改的行是这一行:

if (type == C_FILE)

在我的 coreutils 源代码中,它是第 1 行。5033,内部函数get_color_indicator

  1. 将该行编辑为以下内容:
if ((type == C_FILE) || (type == C_EXEC))

笔记:至于我们为什么这样做,请阅读该行上方的评论:

/* Check the file's suffix only if still classified as C_FILE.  */

滚动上面几行,我们看到该文件C_FILE仅在是常规文件时才被分类。可执行文件和多硬链接等文件(您可以看到其他类型的相同行)不被分类为C_FILE.

可执行文件被分类为C_EXEC.修改该行,我们允许C_EXEC设置了该标志的文件与其他文件一起使用不同的颜色C_FILE

如果需要,您还可以C_MULTIHARDLINK以相同的方式添加其他标志(例如 )。

  1. 编译您修改后的ls.为此:(一定要在coreutils-9.1目录中)
./bootstrap
./configure

make clean
make -j $(nproc)

(请参阅如果不清楚,请回答编译步骤。)

  1. 现在您可以使用ls位于 的新创建的进行测试src/ls。一旦你对你的修改有足够的信心ls,你就可以移动你的ls去替换/bin/ls。我实际上想保存旧版本的备份ls,但这是你的愿望。

最后一步:修改您的LS_COLORS并享受您的美丽ls:-)

相关内容