내 Linux 컴퓨터에서 다음과 같은 작업을 수행하고 싶습니다.
if [[ colors exist ]];then
echo "some text in colors"
fi
내 질문은 다음과 같습니다
로그 파일의 일부 텍스트에 색상을 추가하기 위해 sed를 사용하고 있지만 Linux 상자에 색상이 활성화되어 있지 않으면 [033m 등과 같은 불필요한 문자를 추가하는 등 불필요한 방식으로 로그 파일을 수정합니다.
답변1
아마도 tput을 사용하여 사용 가능한 색상 수를 확인할 수 있습니다.
ncolors=$(tput colors)
if [[ $ncolors -ge 8 ]];then
# colors available
fi
답변2
tty 색상은단말기텍스트가 표시됩니다. 요즘 거의 모든 터미널은 ANSI 이스케이프 시퀀스를 처리하므로 텍스트를 생성할 때 색상을 지정할 수 있지만 실제로는 글을 쓸 때 색상을 지정해야 합니다(아마도 쓰기 측에서 사용자 제어에 따라). 예를 들어 호출기 텍스트의 사용자 정의 색상을 설정합니다.
답변3
터미널 에뮬레이터에서 직접 실행 중인지 또는 출력이 로그 파일에 기록되고 있는지 감지하는 한 가지 가능한 방법은 다음을 사용하는 것입니다 readlink
.
if [[ $(readlink -f /dev/stdout) =~ '^/dev/pts/' ]]; then
# colors available
fi
이것은 일반적으로 udev 및 procfs를 사용하는 최신 Linux에서 작동합니다. 더 휴대하기 쉬운 것이 있는지 잘 모르겠습니다. 이것은 특별한 bash 정규식 연산자를 사용하므로 =~
bash에서만 작동합니다.
다른 사람들이 이미 설명했듯이 또 다른 접근 방식은 ; 을 사용하는 것입니다. tty >/dev/null
그러나 귀하의 경우 stdin이 아닌 stdout에만 관심이 있을 수 있으므로 stdout을 다음 stdin으로 만들어야 합니다 tty
.
if tty <&1 >/dev/null; then
# colors available
fi
이렇게 하면 달리는 동안 색상이 비활성화되지만 ./myscript.sh >>log_file
달리는 동안에는 색상이 활성화됩니다 ./myscript.sh
.
[[ $(tput colors) -ge 8 ]]
또한 환경변수를 TERM
로 설정 하면 dumb
색상이 출력되지 않도록 사용하시는 것을 추천드립니다 .
색상을 사용하여 로그 파일에 쓰는 경우에도 읽을 수는 있지만 색상을 지원하는 터미널 에뮬레이터와 less -r
같은 것을 사용해야 합니다 .multitail -cT ansi