Algo que noté en Ubuntu durante mucho tiempo y que me ha frustrado es cuando escribo un comando en la línea de comando que se hace más largo (más ancho) que el ancho del terminal, en lugar de ajustarse a una nueva línea, vuelve a columna 1 en la misma línea y comienza a sobrescribir el comienzo de mi línea de comando. (En realidad, no sobrescribe el comando real, pero visualmente, sobrescribe el texto que se mostró).
Es difícil de explicar sin verlo, pero digamos que mi terminal tenía 20 caracteres de ancho (el mío tiene más de 120 caracteres, pero solo por un ejemplo), y quiero hacer eco del alfabeto inglés. Lo que escribo es esto:
echo abcdefghijklmnopqrstuvwxyz
Pero cómo se ve mi terminal antes de presionar la tecla es:
pqrstuvwxyzghijklmno
Cuando presiono enter, se hace eco
abcdefghijklmnopqrstuvwxyz
entonces sé que el comando se recibió correctamente. Simplemente envolvió mi escritura después de la "o" y comenzó de nuevo en la misma línea.
Lo que esperaría que sucediera, si escribiera este comando en una terminal que solo tenía 20 caracteres de ancho, sería esto:
echo abcdefghijklmno
pqrstuvwxyz
Antecedentes: estoy usando bash como mi shell, y tengo esta línea en mi ~ / .bashrc:
set -o vi
para poder navegar por la línea de comandos con comandos VI. Actualmente estoy usando el servidor Ubuntu 10.10 y me estoy conectando al servidor con Putty.
En cualquier otro entorno en el que haya trabajado, si escribo una línea de comando larga, agregará una nueva línea debajo de la línea en la que estoy trabajando cuando mi comando sea más largo que el ancho del terminal y cuando sigo escribiendo puedo ver mi comando en 2 líneas diferentes Pero mientras pueda recordar haber usado Ubuntu, mis comandos largos solo ocupan 1 línea.
Esto también sucede cuando vuelvo a los comandos anteriores en el historial (presiono Esc, luego 'K' para volver a los comandos anteriores): cuando llego a un comando anterior que era más largo que el ancho del terminal, la línea de comando se pone destrozado y no puedo decir dónde estoy en el comando.
La única solución que he encontrado para ver todo el comando largo es presionar "Esc-V", que abre el comando actual en un editor de VI.
No creo que tenga nada extraño en mi archivo .bashrc. Comenté la línea "set -o vi", y todavía tenía el problema.
Descargué una copia nueva de Putty y no realicé ningún cambio en la configuración; simplemente escribí mi nombre de host para conectarme y todavía tengo el problema, así que no creo que sea algo con Putty (a menos que necesite hacer algunos cambios de configuración)
¿Alguien más ha tenido este problema y alguien puede pensar en cómo solucionarlo?
Editar
Era mi archivo .bashrc. Copié el mismo perfil de máquina a máquina, y usé caracteres especiales en mi $ PS1 que de alguna manera lo están descartando. Ahora me quedo con las variables bash estándar para mi $ PS1.
¡Gracias a @ ændrük por el consejo sobre el .bashrc!
... Fin Editar ...
fuente
/etc/skel/.bashrc
. Tenga en cuenta que deberá volver a conectarse para que los cambios surtan efecto y asegúrese de mantener una copia de seguridad de su propio .bashrc.tput smam
Respuestas:
Asegúrese de que todos los bytes no imprimibles en su PS1 estén contenidos dentro
\[ \]
. De lo contrario, bash los contará en la longitud de la solicitud. Utiliza la longitud de la solicitud para determinar cuándo ajustar la línea.Por ejemplo, aquí bash cuenta el aviso como 19 columnas de ancho, mientras que el aviso que muestra el terminal tiene solo 10 columnas de ancho (
My prompt
escrito en cian y>
escrito en color predeterminado):mientras que aquí solo cuenta el indicador como 10 columnas de ancho porque ignora los bytes entre el especial
\[
y los\]
escapes:Sin embargo, para una buena práctica, úselo
tput
para generar los escapes de terminal en lugar de codificarlos:Consulte http://mywiki.wooledge.org/BashFAQ/053 , y también http://wiki.bash-hackers.org/scripting/terminalcodes para obtener más información
tput
.fuente
PS1='...'
: ¿por qué las comillas simples no previenen$cyan
y$reset
sustituyen?$cyan
y$reset
se sustituyen, peroPS1
se evalúa cada vez que se imprime la solicitud. Puede ver esto intentandoPS1='$var> '
y luego darvar
varios valores y ver cómo cambia la solicitud. Luego intentePS1="$var> "
y observe que el mensaje permanece estático;$var
se expandió durante la asignación, no todas las vecesPS1
se evalúa.PS1=${PS1}"\e]2;$@\a"
. Lo intentéPS1=${PS1}"\[\e]2;\]$@\[\a\]"
Supongo que has configurado tu
PS1
con colores, ¿verdad?Solo asegúrese de tener
\[
dentro de suPS1
presupuesto antes de su conjunto de coloresPor ejemplo:
fuente
export PS1='^[[96m'$(hostname)'<^[[92m${PWD}^[[96m>^[[97m '
: he estado usando esa durante mucho tiempo, es compatible con KSH ...\[
al principio y\]
al final.\\[
fue un error tipográfico causado por una edición. Lo he arregladoTuve un problema similar y finalmente encontré una solución simple.
Agregue la siguiente línea en su
.bashrc
archivo:Luego escriba
source ~/.bashrc
para obtener el efecto deseado.fuente
source .bashrc
. Su mensaje se actualizará inmediatamentesetwinsize
configurada para mi bash, por lo que no estaba actualizando COLUMNAS correctamente, vea unix.stackexchange.com/a/167911/8337export COLUMNS=250
seguíexport TERM=xterm
y fue feliz.Tuve el mismo problema con un indicador de color personalizado, a pesar de que contenía códigos de color
\[
y\]
delimitadores. Resulta que bash tiene problemas para hacer eco de los colores dentro de una función . Terminé usando solo variables para mi solicitud, y aunque mi .bashrc es un poco menos elegante, todo funciona bien ahora.fuente
Una cosa simple sería agregar la siguiente línea antes de configurar la PS1:
Por ejemplo,
sin embargo, esto afecta a otros comandos de Unix como ls y man.
fuente
Tuve este problema cuando me conecté en tmux. El problema fue que tuve una
ipython
sesión en segundo plano (ctrl + z
) y que de alguna manera rompió el ajuste de línea. Tan pronto como lo terminé (fg
,ctrl+d+d
) mi terminal comenzó a funcionar correctamentePor lo tanto, compruebe si hay mensajes interactivos detenidos.
fuente
Así que tuve el mismo problema con un ligero giro y pensé en compartir mi solución también, solo para agregar mi pequeño matiz: D
Mi PS1 inicial fue
El problema que tuve fue que estaba tratando de cambiar el título de mi terminal , así como el símbolo del sistema. La forma en que hice esto fue agregando
\[\033]0;\]Title\a
a la variable PS1 .Entonces ahora mi PS1 era:
Esto estropeó la línea que me envolvía. Finalmente descubrí que a bash no parece gustarle tenerlo
\a
al final. Para evitar esto, puse el título en una variable, que parecía arreglarlo.fuente
\[
y\]
no funcionó para mí Supongo que hubo algo diferente sobre cómo estaba generando el aviso (desde un programa externo), o porque mi aviso era "dinámico".Después de leer esto , descubrí que realmente puedes escapar de los códigos de color con los bytes
0x01
y0x02
.Por ejemplo, estoy usando una versión especial de Chalk y envuelvo los colores usando esto:
fuente