Bash prompt de cor invisível

1

Existe uma maneira de ocultar algumas informações no prompt de Bash ( $PS1 ), por exemplo? algo como uma "cor invisível", usando sequências de escape ANSI.

O método deve ser universal. Não deve usar um recurso de invisibilidade especial de alguns tipos de terminais raros. Os dados ocultos devem permanecer ocultos em, e. um console Linux puro ( $TERM == linux ) também.

    
por mykhal 12.07.2010 / 14:25

1 resposta

4

Defina as cores do primeiro plano e do plano de fundo da mesma forma:

PS1='\[$(tput setab 0)$(tput setaf 0)\]hello\[$(tput sgr0)\]$ '

Se a cor de fundo da tela for diferente, você terá uma barra colorida que será exibida, mas o texto ainda ficará invisível. Se você estiver usando um mouse, poderá selecionar, copiar e colá-lo, e a cópia colada ficará visível.

Usando tput em vez de codificar os códigos de escape, isso será portátil para diferentes tipos de terminais. Você pode acelerar as coisas, no entanto, se definir variáveis ao mesmo tempo, defina PS1 e use-as no seu prompt. Dessa forma, tput não é chamado várias vezes toda vez que um prompt é emitido.

back=$(tput setab 0)
fore=$(tput setaf 0)
none=$(tput sgr0)
PS1='\[$back$fore\]hello\[$none\]$ '

Editar:

Para tornar aparente texto com largura zero incluído no prompt, apenas faça o backspace sobre ele. Para obter o ^? , basta pressionar Ctrl-v e retroceder.

PS1='\[hello ^?^?^?^?^?^?\]$ '

Para acomodar texto de várias larguras:

PS1='This shows\[$(word='This doesn't';bs=${word//?/^?};echo "$word$bs")\]$ '

O uso de uma variável provavelmente acabaria com seu propósito de analisar metadados, mas eu a incluo por completo:

text='Something to hide'
PS1='This shows\[$(word=$text;bs=${word//?/^?};echo "$word$bs")\]$ '

ou

PS1='This shows\[$(bs=${text//?/^?};echo "$text$bs")\]$ '

Editar 2:

Para essa questão, você pode fazer isso:

PS1='This shows$(: This is hidden)$ '

Editar 3:

Para torná-lo mais dinâmico, use PROMPT_COMMAND para definir PS1 :

$ PROMPT_COMMAND="PS1='This shows\$(: '\$data')$ '"
This shows$ data="This is hidden"
This shows$ echo "Prompt: $PS1"
Prompt: This shows$(: This is hidden)$ 
This shows$ data="Top Secret"
This shows$ echo "Prompt: $PS1"
Prompt: This shows$(: Top Secret)$ 

Citar pode ser um desafio. Se você puder evitar aspas simples ou duplas em seus dados, a técnica PROMPT_COMMAND funcionará bem.

    
por 12.07.2010 / 15:33