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]\$ '
Réponses:
J'ai expérimenté les éléments suivants pour émuler la fonctionnalité de
zsh
Bash:Il émet un signe de pourcentage vidéo inverse, suivi d'un tas d'espaces pour le faire passer à la ligne suivante, puis d'un retour chariot, suivi d'un signe dollar et d'un espace. Vous pouvez ajouter des échappements d'invite après le "\ 015" pour personnaliser votre invite.
Son utilisation dépend de la façon dont votre terminal gère l'habillage de la ligne de marge droite (marges automatiques). La longueur de PROMPT_SP est arbitraire, mais doit être d'au moins 80 ou quelle que soit la largeur de terminal habituelle. Vous devrez peut-être coder en dur cette valeur si $ COLUMNS n'est pas encore défini au moment de l'
for
exécution de la boucle~/.bashrc
. Vous voudrez peut-êtreshopt -s checkwinsize
si ce n'est pas déjà fait.la source
printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
man 5 terminfo
et rechercher «vidéo inverse» pour voir une documentation qui utilise cette terminologie.Non ce n'est pas possible. Bash lui-même ne traite pas ou ne voit pas la sortie du programme qu'il a démarré.
Il m'est juste venu à l'esprit qu'il pourrait être possible d'écrire un programme à définir
PROMPT_COMMAND
, qui vérifierait la position actuelle du curseur et émettrait une nouvelle ligne si le curseur n'était pas sur le bord gauche.la source
zsh
essaie de résoudre votre problème. Si la dernière sortie se termine sans nouvelle ligne, vous obtiendrez:Où
%
utilise l'arrière-plan / premier plan inversé. Je ne sais pas s'il est portable debash
quelque manière que ce soit.la source