컬러 터미널 출력을 유지하지만 호출기를 비활성화하는 방법

컬러 터미널 출력을 유지하지만 호출기를 비활성화하는 방법

macOS에서 man은 호출기 "/usr/bin/less -is"를 사용합니다( man에 대한 매뉴얼 페이지 참조). man을 입력하면 컬러 출력이 표시되는데 마음에 듭니다. 그러나 나는 man을 사용할 때 터미널의 find 명령을 사용하는 것을 선호하며 Less의 페이징 동작이 방해가 된다고 생각합니다.

호출기를 고양이로 설정하면 색상이 손실됩니다.

페이징을 비활성화하고 색칠을 계속하는 방법은 무엇입니까?

답변1

예를 들어 man의 출력을 다른 프로그램으로 파이프하면 출력이 형식화되지 않은 것처럼 보이지만, cat(1)예를 들어 hexdump 프로그램을 사용하여 출력을 보면 형식이 유지되는 것을 볼 수 있습니다.catxxd(1)

man man | xxd

0x08서식은 굵은 서식과 밑줄에 사용되는 백스페이스 문자를 사용하여 표시됩니다 . 문자에 밑줄을 긋려면 먼저 밑줄 문자를 인쇄한 다음 백스페이스 문자를 인쇄하고 커서를 한 위치 뒤로 이동한 다음 밑줄을 긋고 싶은 문자를 씁니다. 굵은 문자를 만들려면 먼저 문자를 쓴 다음 커서를 한 위치 뒤로 이동한 다음 문자를 다시 씁니다. 하드카피 터미널의 결과는 예상한 효과를 가지지만 터미널 에뮬레이터에서는 두 번째 문자가 첫 번째 문자를 덮어쓰고 형식이 지정되지 않은 것처럼 보입니다. 이 프로그램을 사용하면 이 형식을 터미널에서 사용하는 형식으로 변환할 수 있습니다 ul(1).

man man | ul

ESC이제 이 파이프 출력의 바이트 인코딩을 확인하면 terminfo/termcap 터미널 설명이 코드 또는 사용하기로 결정한 다른 코드를 사용하는지 여부를 볼 수 있습니다 .ul

man man | ul | xxd

두 가지 모두 제어 코드를 사용자에게 명확한 형식으로 more변환하므로 사용자는 검사 중인 파일에 제어 코드가 포함되어 있는지 여부를 알 수 있습니다. 출력을 페이징 하고 터미널이 코드를 해석하게 하려면 원시 문자 코드를 출력하도록 페이저를 구성해야 합니다. 이를 달성하려면 또는 옵션을 사용할 수 있습니다 .lessESCulESC-r-Rlessmore

man man | ul | less -r

less이러한 옵션은 호출자 에게 전달되는 기본 옵션에 포함되지 않습니다 less -is.

ESC페이지 매김 없이 코드를 보려는 경우 사용할 수 있는 -v옵션 입니다 cat.

man man | ul | cat -v

위에서 밑줄 친 텍스트와 굵은 텍스트의 서식을 복원하는 방법에 대해 설명했지만 색상을 출력하도록 구성해도 색상이 출력되지 않습니다 less. ( less출력 색상은 환경 변수를 사용하여 설정할 수 있습니다 LESS_TERMCAP_*. 이 기능은 MacOS Big Sur 11.7.3의 매뉴얼 페이지에 나열되어 있지 않지만 계속 사용할 수 있으며 less업데이트된 문서 less에 설명되어 있습니다 .https://github.com/gwsw/less/blob/919fcc8222ebbe8a25f3f81a735222b8fdc78433/less.nro.VER#L2252. 아마도 Big Sur와 함께 배포된 매뉴얼 페이지는 less실제 프로그램에 비해 오래된 것 같습니다. 바라보다https://www.2daygeek.com/get-display-view-colored-colorized-man-pages-linux/환경 변수 사용의 몇 가지 예 LESS_TERMCAP_*. ) 그러나 사용할 터미널 설명을 지정하는 옵션이 ul있으므로 -t원하는 방식으로 굵은 글씨와 밑줄을 표시하는 수정된 터미널 설명을 직접 만들 수 있습니다. 다음은 terminfo 설명을 기반으로 한 샘플 terminfo 설명입니다 xterm-256color.

xterm-256color-manpipecolors|xterm-256color with preset colors for retaining color in piped manpages,
    blink=\E[1;31m,
    bold=\E[1;36m,
    sgr0=\E[0m,
    smso=\E[01;44;33m,
    rmso=\E[0m,
    smul=\E[1;32m,
    rmul=\E[0m,
    use=xterm-256color,

파일 이름이 지정되어 있다고 가정하면 xterm-256color-manpipecolors다음 명령을 사용하여 컴파일할 수 있습니다.~/.terminfo

tic xterm-256color-manpipecolors

terminfo 설명은 다음과 같이 페이지되지 않은 출력에 사용할 수 있습니다.

man man | ul -t xterm-256color-manpipecolors

하지만 이 파이프의 출력을 페이징하려면 원시 문자를 출력하도록 페이저를 설정해야 합니다.

man man | ul -t xterm-256color-manpipecolors | less -r

환경 변수를 사용하여 이를 정리할 수 MANPAGER있으며 결과가 파이프로 연결되어도 작동하는 것을 볼 수 있으므로 cat페이징을 피할 수 있습니다.

MANPAGER='ul -t xterm-256color-manpipecolors | less -isr' man man
MANPAGER='ul -t xterm-256color-manpipecolors | less -isr' man man | cat

당신이 넣으면

export MANPAGER='ul -t xterm-256color-manpipecolors | less -isr'

~/.bashrc셸 시작 부분 에서 호출되므로 man페이지가 매겨진 동작과 페이지가 매겨지지 않은 동작을 매우 깔끔한 방식으로 얻을 수 있습니다.

man man       # with color and paging
man man | cat # with color and without paging

less나는 이것이 tty 인지 확인하고 stdout, tty가 아닌 경우 tty 코드를 인쇄하거나 출력을 페이지하지 않도록 하드코딩되어 있기 때문에 작동한다고 추측합니다 .

관련 정보