La plupart du temps, la sortie d'une commande se termine par le caractère de nouvelle ligne. Mais parfois, ce n'est pas le cas, donc l'invite suivante du shell est imprimée sur la même ligne avec la sortie.
Exemple:
root @ hostname [~] # echo -n bonjour
helloroot @ hostname [~] #
J'ai toujours trouvé ça très ennuyeux.
Maintenant, je pourrais simplement ajouter un "\ n" au début de la variable PS1, mais la plupart du temps cela imprimera une ligne supplémentaire dont je n'ai pas besoin.
Est-il possible de savoir si la sortie de la dernière commande s'est terminée par une nouvelle ligne ou non?
Solution:
(Merci à Dennis)
PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '
$()
à un endroit et vous avez fait des retours dans un autre. Vous pouvez utiliser $()
dans les deux.
tput cols
car il ne produit que la valeur de la variable COLUMNS de toute façon, et il est plus lent car ce n'est pas un shell intégré. Vous souhaiterez également inclure \e[K
(équivalent à tput el
) pour supprimer les espaces insérés afin de ne pas obtenir un tas d'espaces de fin lors de la copie et du collage dans le cas par défaut. Enfin, vous devez inclure toute cette magie entre \[
et \]
sinon bash essaiera de deviner la position de votre curseur et cela gâchera lorsque vous éditerez votre commande / historique.
PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '