나는 일부 Unix 명령을 전송하기 위해 내 스크립트를 사용하고 있습니다. 문제는 내 스크립트에서 색상을 사용하고 있다는 것입니다. 예를 들어:
yellow=`tput setaf 3`
reset=`tput sgr0`
function Warning()
{
echo "${yellow}$*${reset}"
}
사용할 수 있는 명령이 있습니다 Warning "Compress $directory"
.
이것을 find 명령에 입력하고 싶습니다.
나는 다음을 사용하고 있습니다 :
./compress.sh | grep Push | awk '{print $2}' | while read directory; do find $directory | wc -l; done;
그러나 다음 오류가 발생합니다.
find: '/some_directory\033(B\033[m': 해당 파일이나 디렉터리가 없습니다 0
awk
인쇄 끝 부분에 보이지 않는 문자가 추가되었거나 색상이 파이핑과 혼동된 것처럼 보입니다 .
이 오류가 발생하는 이유는 무엇입니까? 어떻게 해야 합니까?
답변1
터미널 색상은 이스케이프 시퀀스를 통해 작동합니다. ${yellow}
실제로는 \033[0;33m
(또는 \e[0;33m
) ${reset}
이고 입니다 \033[0m
. 시도해 볼 수 있습니다 echo -e '\e[0;33m yellow \e[0m'
(기본 색상 코드 목록).
\033
ASCII 및 유니코드에서 Escape인 8진수 033을 나타내는 문자입니다. \e
탈출하는 또 다른 방법이다. [
코드의 시작을 표시 하고 m
코드의 끝을 표시합니다.
대부분의 프로그램은 색상 코드를 해석할 수 없으므로 파이프를 사용하는 경우 이를 비활성화해야 합니다. 당신은 할 수프로그램이 파이프라인에서 실행 중인지 감지, [[ -t 1 ]]
true인 경우 터미널에 쓰고 있는 것이고, false인 경우 다른 곳에 쓰는 것입니다. 아마도 파이프일 것입니다.
이는 터미널에 인쇄할 때만 색상을 출력합니다.
yellow=''
reset=''
if [[ -t 1 ]]; then
yellow=`tput setaf 3`
reset=`tput sgr0`
fi
function Warning()
{
echo "${yellow}$*${reset}"
}