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?
Réponses:
J'ai trouvé la réponse sur askubuntu.com . @qeirha a mentionné que vous devez dire à bash que la séquence de caractères ne doit pas être comptée dans la longueur de l'invite, et vous le faites en l'enfermant dans
\[
\]
. Sur la base de l'exemple fourni, voici une solution:la source
PS1
code, pourquoi ne l'ai-je pas vu?(Désolé, aucune explication ici. Voir Comment personnaliser correctement la PS1? Ou toute autre question sur les problèmes de calcul de la longueur des invites et
\[
...\]
)la source
\[...\]
fonctionne très bien tant que vous pouvez mettre tout le code que vous souhaitez générer votre invite dans une seule chaîne. Cependant, si vous souhaitez diviser votre code en petites fonctions, vous arrivez à un point où vous ne pouvez pas placer les crochets de début et de fin dans la même chaîne / fonction. Et cela rompt le retour à la ligne. À moins que vous ne recouriez à l'utilisationPROMPT_COMMAND
pour recalculer votrePS1
à chaque invite.En développant la réponse @manatwork mais en gardant votre code divisant le
PS1
calcul en différentes fonctions, vous pouvez écrire votre invite de la manière suivante:Les guillemets doubles sont obligatoires lors de la définition
PS1
et lors de l'utilisationprintf
de la fonction.la source
.bashrc
- ne mettez pas de code dans un fichier séparé et appelez cela.