Caractere Bell e escape na string de prompt

5

Minha string de prompt é impressa usando esta declaração,

printf '3]0;%s@%s:%s
printf '%s@%s:%s' user host /home/user
7' user host /home/user

Por que é necessário um caractere de escape ( 3 ) e um caractere de campainha ( 007 )? Quando eu corri o mesmo comando manualmente, não imprime nada.

Quando eu removi os caracteres de escape e dei o comando como

user@home:/home/user

imprime,

printf '3]0;%s@%s:%s
printf '%s@%s:%s' user host /home/user
7' user host /home/user

que é mais fácil de entender.

Então, como os caracteres de escape, 3 e 007 são convertidos em uma string de prompt do shell?

    
por Madhavan 09.06.2015 / 11:56

2 respostas

3

Somente 3 é um escape e inicia a sequência de escape até e inclui o ; . %código%. Isso inicia uma string que define o título na barra de título do terminal e que a string é terminada pelo caractere 3]0; special.

Veja man console_codes7 :

   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.

O fato de você não ver nenhuma alteração é provavelmente porque o seu prompt define o título da string de título padrão ao retornar ao prompt. Experimente:

 PROMPT_COMMAND= ; printf '3]0;Hello World!
   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.
7'
    
por 09.06.2015 / 12:31
5

Na verdade, a seqüência de escape começa com o caractere de escape primeiro e termina com 3ESC7 (ASCII BEL e ASCII 0 ).

O 3] é um parâmetro, correspondendo a Ps na descrição do xterm, enquanto o texto após o ponto-e-vírgula é Pt :

        Ps = 0  -> Change Icon Name and Window Title to Pt.
        Ps = 1  -> Change Icon Name to Pt.
        Ps = 2  -> Change Window Title to Pt.

Tanto 3printf77 como BEL são partes da sequência de escape que podem ser alteradas para outros caracteres. O terminal trata o par de bytes como um único caractere de controle (assim como os 4 bytes ESC ]7 são tratados por ESC \ como um único caractere). Referindo-se a Sequências de Controle do XTerm , a seção C1 (8 bits) caracteres de controle podem ser úteis:

ESC \
     String Terminator (ST  is 0x9c).
ESC ]
     Operating System Command (OSC  is 0x9d).

Para entender o início de Controles do sistema operacional :

OSC Ps ; Pt ST
OSC Ps ; Pt BEL

Usar BEL ( BEL ) para finalizar uma seqüência de escape é uma anomalia. Ele não segue o padrão ( ECMA-48 ). Os controles do sistema operacional devem começar com ST ou 0x9d e terminar com BEL ou 0x9c.

Há muito tempo, o (s) desenvolvedor (es) do xterm adicionaram uma seqüência de escape para definir o título. Em X11R1 (1987), o programa simplesmente leu a sequência até obter um caractere não imprimível. Mais tarde, no X11R4 (1989), alguém melhorou isso ao finalizar um caractere BEL . O padrão existe há mais tempo, mas o motivo para escolher %code% em vez de %code% não é conhecido. Em última análise, isso foi abordado no final dos anos 90, reconhecendo (mas mantendo %code% como alternativa, pois muitos usuários confiavam no comportamento codificado com %code% ).

    
por 17.06.2016 / 21:39