
Linux 및 Solaris에서 실행해야 하는 ksh 스크립트가 있습니다. 특정 명령의 출력에 색상을 지정하려고 합니다. Linux(특히 RHEL6)에서는 작동하지만 Solaris(SunOS 5.10)에서는 작동하지 않습니다.
Linux의 명령(출력 "test"가 빨간색으로 올바르게 표시됨):
[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test
Solaris의 명령(출력 "test"는 색상이 지정되지 않음):
[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m
출력에 원래 코드 없이 출력이 빨간색이 되도록 이 명령을 만드는 방법이 있습니까? "echo" 명령은 실제로 실행하는 명령의 패딩일 뿐이므로 변경할 수 없습니다.
답변1
\xNN
GNU sed의 이스케이프 시퀀스이지만 표준은 아니며 특히 Solaris에서는 사용할 수 없습니다.
스크립트에 리터럴 이스케이프 문자를 포함할 수 있지만 이렇게 하면 읽고 편집하기가 어려워집니다.
printf
이를 사용하여 이스케이프 문자를 생성 할 수 있습니다 . 16진수가 아닌 8진수 이스케이프를 이해합니다.
esc=$(printf '\033')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"
전화해도됩니다tput
sed 호출에서 대체 텍스트를 생성합니다. 이 명령은 이스케이프 시퀀스를 찾습니다.용어 정보데이터 베이스. 이론적으로 을 사용하면 tput
스크립트의 이식성이 향상되지만 실제로는 사용하지 않는 터미널을 실행할 가능성이 줄어듭니다.ANSI 이스케이프 코드.
echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"
답변2
이용하시면 더욱 편리하겠습니다tput
tput setaf 1; somecommand; tput sgr0
또는
tput setaf 1
somecommand
tput sgr0
전경을 빨간색으로 설정하고 somecommand
실행 후 출력을 빨간색으로 표시한 다음 색상 순서를 지웁니다. 이는 적어도 bash
, zsh
및 에 적용됩니다 ksh
.
로 무엇을 할 수 있는지 자세히 tmux(1)
알아 보십시오 .terminfo(5)
tput
답변3
더 쉬운 방법도 있습니다:
이스케이프 문자에 해당하는 바이트를 정확히 확인하려면 \033
다음을 수행하세요.
printf "\033" | xxd -p
당신은 얻는다
1b
따라서 이스케이프 시퀀스 \033은 2진수 바이트 0b00011011, 10진수 바이트 27 또는 16진수 바이트 1b에 해당합니다.
좋은 소식: sed는 16진수 코드를 알고 있습니다!
echo "color test" | sed 's,color,\x1b[31m&\x1b[0m,'
이것은 16진수를 알 때 더 나은 솔루션입니다.
답변4
일부 터미널(iterm의 bash와 같은)에서는 "ctrl-v"를 누른 다음 "ctrl+["를 눌러 리터럴 이스케이프 문자를 입력 문자열에 넣을 수 있습니다. 작동하면 화면에 "^[" 문자가 표시될 수 있지만 그 주위로 커서를 이동하면 실제로는 무대 뒤에 있기 때문에 하나의 문자로 처리됩니다.
무슨 일이 일어나고 있는지 확인하고 이것이 작동하는지 테스트하려면 ctrl+v를 입력한 다음 ctrl+i를 입력하면 됩니다. 프롬프트 문자열에 탭 문자가 삽입된 것을 볼 수 있습니다. CS의 역사는 이것이 왜 그런지 설명합니다. 그러나 실제로 오래된 키보드에는 ctrl+I 하드키가 있는 것으로 나타났습니다.열광한탭 문자를 보냅니다. Tab 키도 동일한 전기 신호를 보냅니다.
이러한 레거시 이유로 인해 많은 터미널 bash는 여전히 특정 Ctrl 코드를 해석하여 동일한 문자에 매핑합니다.
Ctrl+I는 탭 문자에 매핑되는 반면, ctrl+[는 ASCII 이스케이프 문자와 정확히 일치합니다.