Tonin apontou um erro no meu prompt padrão . Exemplo mínimo:
Defina PS1:
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " ")$ '
Nesse ponto, o prompt se parece com o seguinte:
$
Agora, ative a saída do código de saída executando:
false
Agora, o prompt contém o código de saída em vermelho no início da linha:
1 $
- Pressione Ctrl- r.
Digite "false". Agora, o prompt contém apenas a pesquisa:
(reverse-i-search)`false': false
- Pressione Enter.
O histórico do terminal resultante agora contém o seguinte:
1 $ch)`false': false
Saída esperada:
1 $ false
Ou seja, parece que a saída da pesquisa de histórico é misturada ao prompt e oculta o comando real que foi executado.
Tentei contornar isso usandoPROMPT_COMMAND
:
set_exit_code() {
exit_code=$?
[[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " "
}
set_bash_prompt() {
PS1='$(set_exit_code)$ ' # Double quotes give the same result
}
PROMPT_COMMAND=set_bash_prompt
Isso não parece funcionar - a linha parece exatamente a mesma de antes, depois de pesquisar e executar.
Como posso consertar isso?
Respostas:
Encontrei a resposta no askubuntu.com . @qeirha mencionou que você precisa informar ao bash que a sequência de caracteres não deve ser contada no comprimento do prompt, e você faz isso colocando-o dentro
\[
\]
. Com base no exemplo fornecido, aqui está uma solução:fonte
PS1
código. Por que não o vi?(Desculpe, não há explicação aqui. Consulte Como personalizar o PS1 corretamente? Ou qualquer outra pergunta sobre problemas de cálculo de tamanho de prompt e
\[
...\]
).fonte
\[...\]
funcionará bem, desde que você possa colocar todo o código que deseja gerar seu prompt em uma única string. No entanto, se você deseja dividir seu código em pequenas funções, chega a um ponto em que não pode colocar os colchetes inicial e final na mesma string / função. E isso quebra quebra de linha. A menos que você recorra ao recursoPROMPT_COMMAND
para recalcular o seuPS1
a cada prompt.Expandindo a resposta @manatwork, mas mantendo seu código dividindo a
PS1
computação em diferentes funções, você pode escrever sua solicitação da seguinte maneira:As aspas duplas são obrigatórias ao definir
PS1
e ao usarprintf
na função.fonte
.bashrc
- não coloque código em um arquivo separado e chame isso.