프롬프트 문자열의 링 및 이스케이프 문자

프롬프트 문자열의 링 및 이스케이프 문자

내 프롬프트 문자열은 다음 명령문을 사용하여 인쇄됩니다.

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마치다( \007ASCIIESC및 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'

관련 정보