행의 배경색을 변경하는 방법은 무엇입니까?

행의 배경색을 변경하는 방법은 무엇입니까?

내 시도는 다음과 같습니다.

여기에 이미지 설명을 입력하세요.

마지막 것은 작동하지만 복사-붙여넣기가 중단됩니다(복사할 때 많은 공백이 추가됩니다). 더 좋은 방법이 있나요?

복사 가능한 텍스트:

$ PS1='\['$'\x1b[0m\]$ '
$ echo -e "\x1b[41;37mWarning text\x1b[0m"; echo Normal text
Warning text
Normal text
$ echo -ne "\x1b[41;37mWarning text"$'\n'"\x1b[0m"; echo Normal text
Warning text
Normal text
$ echo -ne "\x1b[41;37mWarning text"$'\n'"\x1b[47;30m"; tr </dev/zero \\0 \ |head -c 80; echo -ne "\x1b[A";  echo Normal text
Warning text
Normal text                                                                     
$ 
$ t="Warning text";echo -ne "\x1b[41;37m";echo -n "$t";{ tr </dev/zero \\0 \ |head -c $(bc <<<"$(stty -a <&3|grep -Po '(?<=columns )[0-9]+')-$(wc -c<<<"$t")+1"); } 3<&0;echo -e "\x1b[0m";echo "Normal text"
Warning text                                                                    
Normal text
$ 

답변1

나는 스스로 해결책을 찾았습니다.이 관련 질문). 이것을 사용하십시오 :

echo -e '\x1b[41;37mWarning text\x1b[K\x1b[0m';echo Normal text

문서에는 다음과 같이 나와 있습니다 \x1b[K.

       K   EL        Erase line (default: from cursor to end of line).
                     ESC [ 1 K: erase from start of line to cursor.
                     ESC [ 2 K: erase whole line.

답변2

줄 끝까지 지우면 xterm의 현재 배경색과 Linux 콘솔 및 이 동작을 복제하는 터미널이 사용됩니다. ncurses에서는 이것을 배경색 지우기(bce) 기능이라고 합니다. 이 기능이 지원되는 경우 현재 편집된 행의 배경을 지정된 색상으로 유지하는 방법을 제공합니다.

하지만:

  • 줄 바꿈을 편집할 때는 유용성이 떨어집니다.
  • rxvt/urxvt 터미널에는 몇 가지 차이점이 있습니다. 관련 문자 지우기(ech) 기능은 배경색을 사용하지 않습니다. 쉘은 행을 편집할 때 이것을 사용할 수 있습니다.
  • 스크롤할 때 모든 터미널이 현재 배경색을 사용하는 것은 아닙니다(xterm 및 Linux 콘솔처럼).

추가 자료:

답변3

이건 어때:

printf '\e[41m%-*s\e[0m\n' $COLUMNS 'Warning text'

매개변수를 받아들이고 색상 변수를 추가하는 등의 기능을 함수로 만들 수도 있습니다.

linecolor () { printf '\e[41m%-*s\e[0m\n' $COLUMNS "$1"; }

용법:

linecolor 'Warning text'

답변4

추가 초기 빈 줄이 허용되는 경우:

echo -e "\x1b[41;37m\n\x1b[0m\x1b[41;37mWarning\x1b[0m"; echo "Normal"

작동하는 것 같습니다.

내가 보고 있는 동작에 대해 내가 생각할 수 있는 유일한 설명은 터미널이 새 줄에 사용할 배경색을 결정하는 방법에 따라 달라지며, xterm내가 사용하고 있는 터미널과 다른 터미널을 사용하는 경우에는 조금 다르게 작동할 수도 있습니다.

사용하면 마지막 방법을 더 쉽게 읽을 수 있다고 생각하므로 printf복사-붙여넣기가 여전히 중단되더라도 다음과 같습니다.

printf "\x1b[41;37m%-$(stty size | cut -d' ' -f2)s\x1b[0m\n" hello; echo world; echo test

관련 정보