126 votes

Comment faire pour que les longues lignes de commande passent à la ligne suivante ?

J'ai remarqué quelque chose de frustrant dans Ubuntu depuis longtemps : lorsque je tape une commande sur la ligne de commande qui devient plus longue (plus large) que la largeur du terminal, au lieu de passer à une nouvelle ligne, il revient à la colonne 1 sur la même ligne et commence à écraser le début de ma ligne de commande. (Il n'écrase pas réellement la commande, mais visuellement, il écrase le texte qui était affiché).

C'est difficile à expliquer sans le voir, mais supposons que mon terminal ait une largeur de 20 caractères (le mien fait plutôt 120 caractères - mais pour l'exemple), et que je veuille faire écho à l'alphabet anglais. Ce que je tape est ceci :

echo abcdefghijklmnopqrstuvwxyz

Mais ce à quoi ressemble mon terminal avant que j'appuie sur la touche :

pqrstuvwxyzghijklmno

Quand j'appuie sur la touche entrée, il y a un écho

abcdefghijklmnopqrstuvwxyz

donc je sais que la commande a été reçue correctement. Il a juste enveloppé ma frappe après le "o" et a recommencé sur la même ligne.

Voici ce qui devrait se passer si je tape cette commande dans un terminal de 20 caractères seulement :

echo abcdefghijklmno
pqrstuvwxyz

Contexte : J'utilise bash comme mon Shell, et j'ai cette ligne dans mon ~/.bashrc :

set -o vi

pour pouvoir naviguer dans la ligne de commande avec des commandes VI. J'utilise actuellement le serveur Ubuntu 10.10, et je me connecte au serveur avec Putty.

Dans tous les autres environnements dans lesquels j'ai travaillé, si je tape une longue ligne de commande, il ajoute une nouvelle ligne sous la ligne sur laquelle je travaille lorsque ma commande devient plus longue que la largeur du terminal et lorsque je continue à taper, je peux voir ma commande sur 2 lignes différentes. Mais aussi longtemps que je me souvienne d'avoir utilisé Ubuntu, mes longues commandes n'occupaient qu'une seule ligne.

Cela se produit également lorsque je reviens à des commandes précédentes dans l'historique (j'appuie sur Esc, puis sur 'K' pour revenir à des commandes précédentes) - lorsque j'arrive à une commande précédente qui était plus longue que la largeur du terminal, la ligne de commande est déformée et je ne peux pas dire où je me trouve dans la commande.

La seule solution que j'ai trouvée pour voir l'intégralité de la longue commande est d'appuyer sur "Esc-V", ce qui ouvre la commande en cours dans un éditeur VI.

Je ne pense pas avoir quelque chose d'étrange dans mon fichier .bashrc. J'ai commenté la ligne "set -o vi", et j'ai toujours le problème.

J'ai téléchargé une nouvelle copie de Putty et je n'ai apporté aucun changement à la configuration - j'ai juste tapé le nom de mon hôte pour me connecter, et j'ai toujours le problème, donc je ne pense pas qu'il s'agisse d'un problème avec Putty (à moins que je doive apporter des changements à la configuration).

Quelqu'un d'autre a-t-il eu ce problème, et quelqu'un peut-il penser à la façon de le résoudre ?

Modifier

C'était mon fichier .bashrc. J'ai copié le même profil d'une machine à l'autre, et j'ai utilisé des caractères spéciaux dans mon $PS1 qui l'ont en quelque sorte perturbé. Je m'en tiens maintenant aux variables standard de bash pour mon $PS1.

Merci à @ændrük pour l'astuce sur le .bashrc !

...Fin de l'édition...

0voto

Ciprian Tomoiagă Points 551

J'ai eu ce problème lors de la connexion en tmux. Le problème était que j'avais un ipython en arrière-plan ( ctrl + z ) et cela a en quelque sorte cassé l'emballage de la ligne. Dès que je l'ai terminé ( fg , ctrl+d+d ) mon terminal a commencé à fonctionner correctement

Vérifiez donc si les invites interactives sont arrêtées.

0voto

Donc je viens d'avoir le même problème avec une légère torsion et j'ai pensé que je pourrais partager ma solution aussi, juste pour ajouter ma petite nuance :D

Ma première PS1 était

PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$"

Le problème que j'avais, c'est que j'essayais de modifier mon terminal titre ainsi que l'invite de commande. Pour ce faire, j'ai ajouté \[\033]0;\]Title\a à la PS1 variable.

Donc maintenant ma PS1 était :

PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$\[\033]0;\]Title\a"

Cela a gâché l'emballage de la ligne pour moi. J'ai finalement compris que Bash n'aime pas avoir des fichiers \a à la fin. Pour contourner ce problème, j'ai placé le titre dans une variable, ce qui a semblé le résoudre.

TITLE="\033]0;Title\a"
PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$\[$TITLE\]"

0voto

jklp Points 839

\[ y \] n'a pas fonctionné pour moi. Je suppose qu'il y avait quelque chose de différent dans la façon dont je générais l'invite (à partir d'un programme externe), ou parce que mon invite était "dynamique".

Nach en lisant ceci J'ai découvert que l'on peut échapper aux codes de couleur avec la fonction 0x01 y 0x02 octets.

Par exemple, j'utilise une version spéciale de Craie et j'emballe les couleurs en utilisant ceci :

const Chalk = require('@nasc/chalk');

const chalk = new Chalk.constructor({
  wrapper: {
    pre: '\1',
    post: '\2',
  }
});

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X