Pourquoi ZSH termine une ligne avec un symbole en pourcentage mis en surbrillance?

J'ai remarqué cela à l'occasion avec une variété d'applications. J'ai souvent pensé que c'était parce que la sortie a été annulée tôt (ctrl + c, par exemple) ou quelque chose de similaire, et que zsh remplit un nouveau caractère de ligne. Mais maintenant la curiosité a obtenu le meilleur de moi, puisqu'il ne semble pas le faire en bash.

zsh

zsh

bash

entrer la description de l'image ici

Le programme Sequence est quelque chose que j'ai tiré d'un livre en lisant sur les certificateions Java et je voulais juste voir si elle comstackrait et fonctionnerait. J'ai remarqué qu'il n'utilise pas la méthode println() du package / class System.out . Au lieu de cela, il utilise plaine ancienne print() .

Le manque d'un nouveau caractère de ligne est-il la raison pour laquelle j'obtiens ce symbole?

Oui, cela arrive parce que c'est une "ligne partielle". Et par défaut, zsh va à la ligne suivante pour éviter de le couvrir avec l'invite .

Lorsqu'une ligne partielle est préservée, vous verrez par défaut un caractère inverse + gras à la fin de la ligne partielle: un "%" pour un user normal ou un "#" pour root. S'il est défini, le paramètre shell PROMPT_EOL_MARK peut être utilisé pour personnaliser la façon dont la fin des lignes partielles est affichée.

C'est une caractéristique spécifique de zsh (et maintenant du fish aussi) pour vous permettre de voir clairement les lignes non terminées dans la sortie d'une command.

Dans les shells traditionnels, si une command génère des données après le dernier caractère de nouvelle ligne ou, en d'autres termes, si elle quitte le slider terminal au début de la ligne, l'invite suivante du shell finit par être ajoutée à cette dernière ligne non terminée comme dans:

 bash-4.4$ printf XXX XXXbash-4.4$ 

Cela mangle l'invite, et il est facile de rater ce XXX là surtout si vous avez une invite plus raffinée comme ça. Cela affecte également le positionnement du slider qui provoque des problèmes d'affichage lorsque vous déplacez le slider.

zsh contourne cela en montrant que la sortie a une ligne non terminée avec un caractère % en gras et en video inverse et émet l'invite suivante au début de la ligne suivante:

 zsh-5.1.1$ printf XXX XXX% zsh-5.1.1$ 

Il le fait en sortant cette video inverse % à la fin de chaque command (avant chaque invite), mais suivi de 79 espaces (en supposant un terminal de 80 caractères de large), un caractère CR (celui qui ramène le slider au première colonne) et la séquence à effacer à la fin de la ligne (puis l'invite).

De cette façon, s'il y avait une ligne non terminée, puisque le slider n'est pas en première position, ces 80 caractères déplaceront le slider sur la ligne suivante (et que % restra). Sinon, alors ce % et ces 79 espaces seront sur une ligne qui sera supprimée par la suite.

Maintenant, cela ne fonctionne que si le terminal enroule des lignes (par exemple, cela ne fonctionnera pas correctement après tput rmam ). Si vous avez un terminal lent (comme sur la ligne série à 9600 bauds), vous pouvez voir ces % affichés et ensuite supprimés après chaque command, ainsi zsh vous permet de désactiver cette fonctionnalité:

 unsetopt prompt_cr prompt_sp 

De cette façon, zsh se comporte plus comme des coquilles traditionnelles.

Vous pouvez également changer cette marque avec la variable $PROMPT_EOL_MARK .