정확히 한 줄의 배경색을 변경하는 방법은 무엇입니까?

정확히 한 줄의 배경색을 변경하는 방법은 무엇입니까?

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

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

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

복사 가능한 텍스트:

$ 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

관련 정보