$LS_COLORS를 무시하도록 색상 통계 설정

$LS_COLORS를 무시하도록 색상 통계 설정

질문

Bash <tab>자동 완성은 변수를 무시 $LS_COLORS하고 기본 색상 값을 사용합니다.

환경

dircolors 파일이 있고 .bashrc에 다음 선언이 있습니다.

eval `dircolors $HOME/.config/bash/dircolors`

bind 'set colored-stats on'
bind 'set colored-completion-prefix on'

alias ls='ls --group-directories-first --color=auto'

출력 ls색상이 정확 $LS_COLORS하고 탭 자동 완성 색상이 켜져 있습니다. 그러나 탭 자동 완성은 $LS_COLORS일부 기본값을 무시하고 사용합니다(스크린샷).

화면

문맥

저는 Apple 터미널을 사용하는 macOS 13.2.1을 사용하고 있습니다. macports를 통해 GNU bash(5.2.15) 및 GNU ls(9.1, coreutils)를 설치합니다.

질문

이 문제 해결을 시작하는 방법에 대한 조언에 관심이 있으십니까?
누군가가 bash에서 색상 코딩 자동 완성의 논리를 결정하는 소스 파일을 지적할 수 있을까요?
어떤 조언이라도 감사하겠습니다.

답변1

이는 다음에서 구현된 동작입니다.GNU Readline 라이브러리. Readline은 LS_COLORS라이브러리가 초기화되고 색상 지정이 활성화될 때만 구문 분석되며 이후에는 그렇지 않습니다. inputrcReadline이 초기화될 때(읽기 후) 색상 지정이 비활성화된 경우 LS_COLORS이는 무시되고 Readline은 기본 색상을 사용합니다. 문제를 재현하기 위해 사용할 수 있는 이 샘플 C 프로그램을 작성했습니다 -lreadline.

readline_test.c:

#include <stdio.h>
#include <stdlib.h>

#include <readline/readline.h>

int readline_puts(void)
{
    char *in;

    if ((in = readline("> ")) != NULL) {
        puts(in);
        free(in);
    }

    return in != NULL;
}

int main(int argc, char **argv)
{
    if (!readline_puts())
        exit(EXIT_FAILURE);

    // use coloring after Readline was initialized
    rl_variable_bind("colored-stats", "on");

    if (!readline_puts())
        exit(EXIT_FAILURE);

    return 0;
}
$ gcc readline_test.c -o readline_test -lreadline
$ mkfifo myfile1
$ touch myfile2
$ ./readline_test
> myfile<tab>
myfile1 myfile2
> myfile
myfile
> myfile<tab>
myfile1 (yellow, Readline default for pipes) myfile2 (normal)

그러나 LS_COLORS파이프를 다른 색상으로 표시하도록 설정하고 다음 main과 같이 변경했습니다.

int main(int argc, char **argv)
{
    // enable colors before Readline is initialized
    rl_variable_bind("colored-stats", "on");

    if (!readline_puts())
        exit(EXIT_FAILURE);

    if (!readline_puts())
        exit(EXIT_FAILURE);

    return 0;
}
$ gcc readline_test.c -o readline_test -lreadline
$ ./readline_test
> myfile<tab>
myfile1 (configured color) myfile2 (normal)

LS_COLORSBash에서 이를 설명하려면 다음에서 색상을 활성화할 수 있습니다 ~/.inputrc.

$if Bash
set colored-stats on
$endif

변수 업데이트는 LS_COLORS여전히 Readline 색상에 영향을 미치지 않습니다. 색상을 업데이트하려면 Bash를 다시 시작하거나 다른 터미널 세션을 열거나 exec /bin/bash.

관련 정보