리눅스와 솔라리스 모두에서 작동 해야하는 ksh 스크립트가 있습니다. 특정 명령의 출력을 채색하려고합니다. Linux (특히 RHEL6)에서는 작동하지만 solaris (SunOS 5.10)에서는 작동하지 않습니다.
리눅스에서의 명령 (출력 “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’명령을 변경할 수 없습니다. 실제로 실행중인 명령을 채우기 때문입니다.
답변
\xNN
은 GNU sed에서 이스케이프 시퀀스이지만 표준이 아니며 특히 Solaris에서 사용할 수 없습니다.
스크립트에 리터럴 이스케이프 문자를 포함시킬 수 있지만 읽고 편집하기가 어렵습니다.
printf
이스케이프 문자를 생성하는 데 사용할 수 있습니다 . 16 진수가 아닌 8 진수 이스케이프를 이해합니다.
esc=$(printf '\033')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"
tput
sed에 대한 호출에서 대체 텍스트를 생성하기 위해 호출 할 수 있습니다 . 이 명령은 terminfo 데이터베이스 에서 이스케이프 시퀀스를 찾습니다 . 이론적으로 사용 tput
하면 스크립트를 이식성이 향상되지만 실제로는 ANSI 이스케이프 코드를 사용하지 않는 터미널이 발생할 가능성이 거의 없습니다 .
echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"
답변
사용하기 쉬울 것입니다 tput
tput setaf 1; somecommand; tput sgr0
또는
tput setaf 1
somecommand
tput sgr0
전경을 빨간색으로 설정하고 실행합니다. somecommand
한 다음 출력을 빨간색으로 표시 한 다음 색상 순서를 지 웁니다. 이것은 적어도 bash
, zsh
및ksh
.
참조 tmux(1)
하고 terminfo(5)
당신이 무엇을 할 수 있는지에 대한 자세한 내용은 tput
.
답변
일부 터미널 (예 : iterm의 bash)에서 “ctrl-v”키와 “ctrl + [“키를 누르면 문자 이스케이프 문자를 입력 문자열에 넣습니다. 작동하면 화면에 “^ [“문자가 인쇄되는 것을 볼 수 있지만 커서를 그 주변으로 움직이면 실제로 장면 뒤에 있기 때문에 한 문자로 취급합니다.
무슨 일이 일어나고 있는지 이해하고 (가능한 경우 테스트하기 위해) ctrl + v와 ctrl + i를 차례로 입력 할 수 있습니다. 프롬프트 문자에 탭 문자가 삽입 된 것을 볼 수 있습니다. 왜 그런지에 대한 CS 기록이 있습니다. 그러나 실제로 오래된 키보드에는 ctrl + I 하드 유선 이있는 것으로 나타났습니다 가 탭 문자를 보내기 위해 으로 되어 있습니다. 탭 키도 동일한 전기 신호를 보냅니다.
이러한 레거시 이유로 인해 많은 터미널의 bash는 여전히 특정 ctrl 코드를 해석하여 동일한 문자로 매핑합니다.
Ctrl + I는 탭 문자에 맵핑되며 ctrl + [는 ASCII 이스케이프 문자와 일치합니다.