bash를 대화형으로 사용하기 나는 줄이 터미널 너비보다 길어지는 것을 방지하기 위해 cut을 사용하려고 합니다. 그러나 색상 출력에 명령을 사용하면 모든 색상이 잘리고 제거됩니다. 예를 들어: ls -lG | cut -c 1-$COLUMNS
.
색상 형식을 잘라내고 보존할 수 있는 방법이 있습니까?
답변1
여기에 두 가지 질문이 있습니다.
ls -G
출력이 터미널(여기서는 파이프)에 도달하지 않으면 컬러 출력을 중지합니다. GNU는 옵션ls
을 전달해야 하며--color=always
, BSD의 경우 항상 컬러로 출력하도록ls
환경을 null이 아닌 값으로 설정해야 합니다 .CLICOLOR_FORCE
<ESC>[1;31m
색상은 전경의 굵은 빨간색 과 같은 문자 시퀀스인 이스케이프 시퀀스를 출력하여 얻습니다 . 너비는 표시되지 않지만 관련해서는cut
최대 7바이트 또는 문자입니다$COLUMNS
.cut
따라서 계산에서 해당 이스케이프 시퀀스를 무시해야 하기 때문에 여기서는 사용할 수 없습니다 . 대신 다음과 같이 할 수 있습니다.esc=$'\e' # or esc=$(printf '\33') if your shell doesn't do $'...' CLICOLOR_FORCE=1 ls -l | sed " s/^\(\(\($esc\[[0-9;]*m\)*.\{0,1\}\)\{$COLUMNS\}\).*/\1${esc}[m/"
거기 에서 색상이 잘리는 경우를 대비하여
sed
개수를 계산하고 1을 추가하여 색상을 기본값으로 되돌립니다.\e[m
cut
현재 버전의 GNU 구현 과-c
달리 멀티바이트 단일 너비 문자를 처리하지만-b
너비가 0이거나 너비가 2인 문자, 탭 또는 기타 제어 문자는 처리하지 않습니다.
또는 줄바꿈을 하지 않고 직접 자르도록 터미널에 지시할 수 있습니다.
tput rmam
(리셋 모드 자동 마진, tput smam
복구용)
다음과 같은 함수를 정의할 수 있습니다.
nowrap() {
[ -t 1 ] && tput rmam
"$@"; local ret="$?"
[ -t 1 ] && tput smam
return "$ret"
}
alias nowrap='nowrap '
( alias
나중에 별칭 확장을 강제하는 부분 nowrap
)은 다음과 같습니다.
nowrap ls -l ...
답변2
man ls
:
--color[=WHEN]
colorize the output; WHEN can be 'never', 'auto', or 'always' (the
default); more info below
귀하의 ls
구성은 아마도 --color=auto
터미널에 직접 연결될 때만 색상을 출력하도록 구성되어 있을 것입니다. (cut과 같은 다른 명령 대신)
를 사용할 수 있지만 --color=always
전체 색상 항목은 색상을 켜고 끄는 특수 문자(이스케이프 시퀀스)를 삽입하여 작동한다는 점에 유의하세요. 색칠된 단어의 중간을 자르면 "색칠 중지" 순서가 제거되고 다음 줄에도 색칠이 적용됩니다.
어쩌면 ls --color=always|less -RS
그것은 당신이 원하는 것을 할 것입니다.
답변3
색상 형식이 유지되도록 터미널로 출력을 가짜로 만들려면 (FreeBSD) 명령(또는 이와 유사한 것)을 사용하여 ls
의사 터미널에서 실행할 수 있습니다.script
ptymagic.c).
script -q /dev/null ls -lG | tr -d '\r' | cut -c 1-$COLUMNS
ptymagic ls -lG | cut -c 1-$COLUMNS
답변4
less -RS
내가 생각할 수 있는 가장 가까운 간단한 솔루션입니다. 유명한 호출기는 less
색상 변경 이스케이프 시퀀스를 처리 -R
하고( ) 긴 줄을 자르도록 요청받을 수 있습니다( -S
).
-E
파일 끝에서 종료하고 -F
내용이 화면에 맞으면 즉시 종료하는 등의 옵션도 있습니다 .
less
개발자가 원하는 동작에 대한 기능 요청을 기꺼이 수락하는지 확인하는 것은 흥미로울 것입니다. 실제로 목적에 맞지는 않지만 less
유틸리티는 기본적으로 필요한 모든 블록을 이미 구현했으며 기능 요청을 지원하기 위해 확장하기가 가장 쉽습니다.