J'ai un problème où si je tape de très longues commandes dans bash, le terminal ne rendra pas ce que je tape correctement. Je m'attendrais à cela si j'avais une commande comme celle-ci:
username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com
La commande doit être rendue sur deux lignes. Au lieu de cela, il se déroulera souvent et commencera à écrire par-dessus mon invite, un peu comme ceci:
myreallylongusername@something.somelongserver.comh -i /path/to/private/key
Si je décide de revenir en arrière et de changer d'argument, rien ne dit où le curseur apparaîtra, parfois au milieu de l'invite, mais généralement sur la ligne ci-dessus où je tape.
L'amusement supplémentaire se produit quand quand je Upà une commande précédente. J'ai essayé cela à la fois dans gnome-terminal et terminator, ainsi que sur i3 et Cinnamon. Quelqu'un a suggéré que c'était ma réponse, alors voici:
\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
Ctrll, reset
et clear
tous font ce qu’ils disent, mais c’est quand je tape la commande ou que Uples mêmes choses se passent.
J'ai vérifié et checkwinsize
est activé dans bash. Cela se produit sur 80x24 et d'autres tailles de fenêtre.
Est-ce juste quelque chose que j'apprends à vivre? Y a-t-il un morceau de magie que je devrais savoir? Je me suis contenté d'utiliser une invite très courte, mais cela ne résout pas le problème.
env -i bash --norc
corrige. Les correspondances $ COLUMNS et $ LINES. Est-ce que cela signifie qu'il y a quelque chose de drôle avec mon .bashrc?\[\033[01;32m\]\u: \[\033[01;34m\]\W \[\033[01;34m\] \$ \[\033[0m\]
semble éviter le comportement bizarre - mais je ne sais pas si cela respecte complètement votre invite d'origine ...tput smam
Réponses:
Les séquences non imprimables doivent être incluses dans
\[
et\]
. En regardant votre PS1, il y a une séquence non fermée après\W
. Mais la deuxième entrée est redondante et répète la déclaration précédente "1; 34" .En tant que tel, il aurait dû être prévu de colorer:
Conserver "l'original" devrait également fonctionner:
Modifier:
La raison du comportement est parce que
bash
croit que l'invite est plus longue qu'elle ne l'est réellement. Comme exemple simple, si on utilise:L'invite est censée être composée de 8 caractères et non de 1. En tant que telle, si la fenêtre du terminal comporte 20 colonnes, après avoir tapé 12 caractères, il est supposé être composé de 20 caractères. Ceci est également évident si on essaie ensuite de faire un retour arrière ou Ctrl+u. Il s’arrête à la colonne 9.
Toutefois, la nouvelle ligne ne commence pas non plus, à moins qu’une des colonnes ne figure dans la dernière colonne. La première ligne est par conséquent remplacée.
Si vous continuez à taper, la ligne doit passer à la ligne suivante après 32 caractères.
la source
La plupart du temps, la taille de la fenêtre supposée par le terminal n’est pas la même que la taille réelle de votre fenêtre. Si vous utilisez bash, vous pouvez essayer ceci.
Si vous n'obtenez pas
Puis activez-le avec
Ensuite, essayez simplement d’exécuter une autre commande (comme
ls
) ou de redimensionner la fenêtre une fois, ce qui précède fonctionne pour moi à chaque fois.Pour les systèmes Redhat en particulier, le problème est souvent causé par une mauvaise configuration
~/.bashrc
pour ne pas appeler/etc/bashrc
. Normalement, bash charge~/.bashrc
ce qui est appelé/etc/bashrc
, ce qui contient par défautshopt -s checkwinsize
.la source
/etc/bashrc
, tout le reste était bon à faire ... s’avère que c’est la cause des problèmes d’emballage.shopt -s checkwinsize
dans la session SSH. Mais l'emballage persiste.Comme mentionné dans d'autres réponses, les séquences non imprimables telles que celles qui
\e[0;30m
doivent être enveloppées\[...\]
.De plus (et ce que je ne vois pas encore mentionné), il semble que cela
\r\n
devrait être en dehors du\[...\]
si vous avez une invite multiligne. Il m'a fallu des essais et des erreurs pour finalement comprendre cela.la source
Une fois, j’ai lu quelque part (je ne sais plus où) que l’utilisation
\001
et la\002
place de\[
et\]
peuvent résoudre ce problème. Ça l'a fait pour moi.En passant, définir PS1 n'a pas à paraître laid.
la source
Cela ressemble à un problème avec vos paramètres de variable
COLUMNS
&LINES
environment. Lorsque vous redimensionnez la fenêtre, elles sont généralement définies automatiquement par gnome-terminal (je crois), vous pouvez les forcer à être définies manuellement en lançant la commanderesize
.Exemple
Si je redimensionne mon gnome-terminal à 79x17, mes variables apparaissent comme suit:
Je peux le forcer comme ça:
la source
Pour éviter le retour à la ligne, vous pouvez également augmenter le nombre de colonnes en utilisant, par exemple:
la source
Le même problème peut également être provoqué par l'utilisation de symboles unicode larges (comme à partir de https://stackoverflow.com/a/34812608/1657819 ). Voici l'extrait cause du problème ( l' esprit le
$Green
et$Red
sont correctement échappé des chaînes de couleurs):Bash ne peut pas calculer la longueur correctement, aussi pourrait-il être plus simple d’échapper deux des trois parties de ces symboles larges.
la source
\001
et\002
.