Comportamento estranho das variáveis de prompt do PS3 e PS4

0

Sei que é possível personalizar o prompt (conforme detalhado no 6.9 Controlando a seção Prompt do manual do Bash) e eu fiz isso por um tempo, mas recentemente notei um comportamento estranho.

Considere os dois cenários a seguir:

Sem seqüências de escape

PS1='\$ '
PS2='> '
PS3='#? '
PS4='+ '

Comseqüênciasdeescape

PS1='\[\e[1;34m\]\$\[\e[0m\]'PS2='\[\e[1;34m\]>\[\e[0m\]'PS3='\[\e[1;34m\]#?\[\e[0m\]'PS4='\[\e[1;34m\]+\[\e[0m\]'

Então, os problemas são:

  • PS3 é impresso como é , sem interpretar as seqüências de escape.
  • PS4 nem é impresso.

Tenho certeza de que eles costumavam trabalhar antes, mas como eu não os uso com muita frequência, não faço ideia desde quando eles estão se comportando mal.

Detalhes técnicos

  • SO: Ubuntu 16.04.4
  • Shell: Bash 4.3.48 (1) -release
  • Emulador de terminal: Terminal GNOME 3.18.3 (também acontece em terminais virtuais)
  • Não houve nenhuma atualização do Bash desde que o sistema foi instalado (2017-06-09), até onde eu sei.
por nxnev 23.04.2018 / 17:29

2 respostas

1

De man bash :

PS1    The value of this parameter is expanded (see PROMPTING below) and used as the primary prompt string.  The default value is ''\s-\v\$ ''.
PS2    The value of this parameter is expanded as with PS1 and used as the secondary prompt string.  The default is ''> ''.
PS3    The value of this parameter is used as the prompt for the select command (see SHELL GRAMMAR above).
PS4    The value of this parameter is expanded as with PS1 and the value is printed before each command bash displays  during  an  execution  trace.   The

Assim, por qualquer razão, a não expansão de PS3 é um comportamento documentado.

Quanto a PS4 , você precisa exportar a variável para disponibilizá-la em uma nova invocação de bash . E você precisa definir a opção de rastreamento explicitamente, -v não a ativa:

pse@Mithos:~/.tmp$ export PS4='uuuu: '
pse@Mithos:~/.tmp$ bash -c "set -x; echo foo"
uuuu: echo foo
foo
    
por 23.04.2018 / 18:01
1

Do manual bash :

   PS1    The  value of this parameter is expanded (see PROMPTING below) and used as the primary prompt string.  The default
          value is ''\s-\v\$ ''.
   PS2    The value of this parameter is expanded as with PS1 and used as the secondary prompt string.  The default  is  ''>
          ''.
   PS3    The value of this parameter is used as the prompt for the select command (see SHELL GRAMMAR above).
   PS4    The  value  of  this  parameter is expanded as with PS1 and the value is printed before each command bash displays
          during an execution trace.  The first character of PS4 is replicated multiple times,  as  necessary,  to  indicate
          multiple levels of indirection.  The default is ''+ ''.

A definição de PS3 não não indica que ela é expandida da mesma maneira que as outras strings de prompt. O comportamento que você vê é consistente com a documentação.

    
por 23.04.2018 / 18:01

Tags