내 프롬프트 문자열은 다음 명령문을 사용하여 인쇄됩니다.
printf '\033]0;%s@%s:%s\007' user host /home/user
이스케이프 문자( \033
)와 벨 문자( 007
)가 필요한 이유는 무엇입니까? 동일한 명령을 수동으로 실행하면 아무것도 인쇄되지 않습니다.
이스케이프 문자를 제거하고 명령을 내리면,
printf '%s@%s:%s' user host /home/user
그것은 인쇄됩니다,
user@home:/home/user
이것은 이해하기 더 쉽습니다.
그렇다면 문자를 어떻게 이스케이프 \033
하고 007
이를 쉘 프롬프트 문자열로 변환합니까?
답변1
사실은,이스케이프 시퀀스다음으로 시작됨첫 번째이스케이프 문자 \033
및마치다( \007
ASCIIESC
및 ASCIIBEL
).
0
는 다음에 해당하는 매개변수 입니다 .추신xterm 설명에서 세미콜론 뒤의 텍스트는 다음과 같습니다.백금:
Ps = 0 -> Change Icon Name and Window Title to Pt.
Ps = 1 -> Change Icon Name to Pt.
Ps = 2 -> Change Window Title to Pt.
\033]
와 둘 \007
다부분이스케이프 시퀀스는 다음과 같이 변경할 수 있습니다.다른수치. 터미널은 이 바이트 쌍을 단일 제어 문자로 처리합니다(4바이트를 단일 문자 \007
로 사용하는 것처럼). printf
인용하다XTerm 제어 순서, 이 부분C1(8비트) 제어 문자도움이 될 수 있습니다:
ESC \
String Terminator (ST is 0x9c).
ESC ]
Operating System Command (OSC is 0x9d).
이해의 초기에운영 체제 제어:
OSC Ps ; Pt ST
OSC Ps ; Pt BEL
사용BEL
( \007
) 이스케이프 시퀀스를 종료하는 것은 예외입니다. 표준을 충족하지 않습니다(ECMA-48). 운영 체제 제어는 ESC ]
또는 0x9d로 시작하고 ESC \
또는 0x9c로 끝나야 합니다.
오래 전에 xterm 개발자는 헤더를 설정하기 위해 이스케이프 시퀀스를 추가했습니다. X11R1(1987)에서 프로그램은 인쇄할 수 없는 문자를 얻을 때까지 단순히 시퀀스를 읽었습니다. 나중에 X11R4(1989)에서 누군가가BEL
특징. 표준은 그보다 더 오래되었지만, 선택한 이유는 다음과 같습니다.BEL
대신에ST
아직 명확하지 않습니다. 결국 문제는 1990년대 후반에 다음 중 하나를 인식함으로써 해결되었습니다.BEL
많은 사용자가 하드코딩된 동작에 의존하므로 대안으로 사용BEL
).
답변2
\033
까지의 이스케이프 시퀀스를 시작하는 이스케이프 일 뿐입니다 ;
. \033]0;
이는 터미널 제목 표시줄에 제목을 설정하는 문자열을 시작하고 문자열은 특수 문자로 끝납니다 \007
.
바라보다 man console_codes
:
It accepts ESC ] (OSC) for the setting of certain resources. In addi‐
tion to the ECMA-48 string terminator (ST), xterm(1) accepts a BEL to
terminate an OSC string. These are a few of the OSC control sequences
recognized by xterm(1):
ESC ] 0 ; txt ST Set icon name and window title to txt.
변경 사항이 표시되지 않는 이유는 아마도 프롬프트를 반환할 때 프롬프트가 제목을 기본 제목 문자열로 설정하기 때문일 것입니다. 노력하다:
PROMPT_COMMAND= ; printf '\033]0;Hello World!\007'