여러 명령에서 예상치 못한 색상 출력이 발생함

여러 명령에서 예상치 못한 색상 출력이 발생함

.bashrc방금 컬러 출력을 얻기 위해 이것을 내 항목에 추가했습니다 less.

# Colorize less man pages.
export LESS_TERMCAP_md=$'\e[01;34m'
export LESS_TERMCAP_us=$'\e[01;33m'
export LESS_TERMCAP_so=$'\e[01;44;37m'
export LESS_TERMCAP_mb=$'\e[01;31m'
export LESS_TERMCAP_mr=$'\e[01;35m'
export LESS_TERMCAP_me=$'\e[00m'
export LESS_TERMCAP_ue=$'\e[00m'
export LESS_TERMCAP_se=$'\e[00m'

...이제 갑자기 특정 명령(환경 변수 표시와 관련이 있는 것으로 보임)이 이러한 새로운 설정과 일치하는 색상 출력을 생성합니다. 제가 탈출을 잘못한 걸까요? 아니면 의도적인 행위일까요? 다른 이스케이프 변형을 시도했지만 작동하지 않습니다 less.

예를 들어 다음은 env명령의 스크린샷입니다.

환경 명령

php -i컬러 출력도 있지만 환경 변수 섹션에만 해당됩니다.

php -i 명령

답변1

이는 정상적인 동작입니다. 이러한 환경 변수에는 터미널의 전경색을 변경하게 하는 이스케이프 시퀀스가 ​​포함되어 있습니다. 어떤 프로그램에서든 출력할 lessenv.

이러한 변수에는 실제 이스케이프 문자가 포함되어야 하며 less는 사후 처리를 수행하지 않습니다.

일반적으로 프로그램에 더 적은 수의 구성 변수를 넣을 수 있습니다.더 적은 키 파일LESS_TERMCAP_xx, 그러나 lesskey 파일을 읽기 전에 less가 변수를 읽기 때문에 변수에는 작동하지 않습니다 (less 444로 시작). 따라서 환경에 투입하는 것 외에는 선택의 여지가 없습니다.

man이러한 변수를 다른 목적 으로만 사용하려면 별칭을 사용하여 환경 변수를 설정하는 래퍼 스크립트에 변수를 설정할 less수 있습니다 .manPAGER

#!/bin/sh
escape=␛     # a literal escape character
export LESS_TERMCAP_md=$escape'[01;34m'
exec less "$@"

(또는 #!/bin/bash첫 번째 줄에 를 사용하여 #'\e'구문을 사용하여 이스케이프 문자를 얻을 수 있습니다. /bin/sh대시가 있는 시스템 에서는 /bin/sh실제로 눈에 띄지 않을 수도 있지만 대시가 있는 시스템에서는 약간 더 빠릅니다.)

이 스크립트를 호출하여 또는 에 less-color추가하십시오 . 일부 시스템에서는 별칭을 만드는 대신 에서 환경 변수를 설정하여 다른 호출기를 사용하도록 나타낼 수 있습니다 .alias man='PAGER=less-color man'~/.bashrc~/.zshrcmanMANPAGERexport MANPAGER=less-color~/.profile

답변2

백슬래시 뒤에 e가 포함된 문자열이 아니라 실제 이스케이프 문자가 포함된 문자열로 이러한 LESS_* 변수의 값을 실수로 설정했다고 가정합니다. 따라서 이 값이 표시될 때마다 단말기의 색상이 변경됩니다.

나는 당신이 .bashrc에 지정한 설정을 주의 깊게 살펴보고 그것이 올바른지 확인하겠습니다. 나는 당신이해야 할 일은 달러 기호를 제거하는 것 뿐이라고 생각합니다.

답변3

@Gilles가 그의 답변에서 지적했듯이 이는 예상되는 동작입니다.

커플 정보를 추가하겠습니다. LESS_TERMCAP_xxTERMCAP 기능을 재정의합니다. 이 재정의는 less자체적으로 관리되며 screen.c해당 값은 나중에 TERMCAP 라이브러리에서 반환된 것처럼 사용됩니다. 이는 제어 문자의 원시 시퀀스여야 함을 의미합니다.

이 문제를 "수정"하는 방법에 대한 내 계정은 less자체 포장 되어 있습니다.

$ cat ~/bin/less 
#!/bin/bash

# Start bold mode
export LESS_TERMCAP_md=$'\e[1;37m'
# Start standout mode
export LESS_TERMCAP_so=$'\e[1;37;41m'
# End standout mode
export LESS_TERMCAP_se=$'\e[0m'
# Start underlining
export LESS_TERMCAP_us=$'\e[4;93m'
# End underlining
export LESS_TERMCAP_ue=$'\e[0m'
# End all mode like so, us, mb, md and mr
export LESS_TERMCAP_me=$'\e[0m'

exec /usr/bin/less "$@"

관련 정보