Tonin a signalé un bogue dans mon invite par défaut . Exemple minimal:
Définir PS1:
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " ")$ '
À ce stade, l'invite ressemble à ceci:
$
Déclenchez maintenant la sortie du code de sortie en exécutant:
false
Maintenant, l'invite contient le code de sortie en rouge au début de la ligne:
1 $
- Appuyez sur Ctrl- r.
Tapez "false". Maintenant, l'invite contient uniquement la recherche:
(reverse-i-search)`false': false
- Appuyez sur Enter.
L'historique du terminal résultant contient désormais les éléments suivants:
1 $ch)`false': false
Production attendue:
1 $ false
Autrement dit, il semble que la sortie de la recherche d'historique soit mélangée à l'invite et masque la commande réelle qui a été exécutée.
J'ai essayé de contourner cela en utilisantPROMPT_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
Cela ne semble pas fonctionner - la ligne est exactement la même qu'avant après la recherche et l'exécution.
Comment puis-je réparer cela?