Tengo un problema en el que si escribo comandos muy largos en bash, el terminal no mostrará lo que estoy escribiendo correctamente. Esperaría eso si tuviera un comando como el siguiente:
username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com
El comando debe representarse en dos líneas. En cambio, a menudo se ajustará y comenzará a escribir sobre la parte superior de mi mensaje, algo así:
myreallylongusername@something.somelongserver.comh -i /path/to/private/key
Si decido regresar y cambiar algún argumento, no se sabe dónde aparecerá el cursor, a veces en el medio de la solicitud, pero generalmente en la línea de arriba donde estoy escribiendo.
Diversión adicional sucede cuando cuando Upa un comando anterior. He intentado esto en gnome-terminal y terminator y en i3 y Cinnamon. Alguien sugirió que era mi mensaje, así que aquí está:
\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
Ctrll, reset
y clear
todos hacen lo que dicen, pero cuando vuelvo a escribir el comando o Upsucede lo mismo.
Lo comprobé y checkwinsize
está habilitado en bash. Esto sucede en 80x24 y otros tamaños de ventana.
¿Es esto algo con lo que aprendo a vivir? ¿Hay alguna pieza de magia que debería saber? Me he conformado con usar un mensaje muy breve, pero eso no soluciona el problema.
env -i bash --norc
arregla. Los $ COLUMNS y $ LINES coinciden. ¿Eso significa que hay algo divertido con mi .bashrc?\[\033[01;32m\]\u: \[\033[01;34m\]\W \[\033[01;34m\] \$ \[\033[0m\]
parece evitar la rareza en el comportamiento - pero no sé si se respeta su pronta originales por completo ...tput smam
Respuestas:
Las secuencias no imprimibles deben incluirse en
\[
y\]
. Mirando tu PS1 , tiene una secuencia no cerrada después\W
. Pero, la segunda entrada es redundante y repite la declaración anterior "1; 34" .Como tal, esto debería haber pretendido colorear:
Mantener el "original" también debería funcionar:
Editar:
La razón del comportamiento es porque
bash
cree que el mensaje es más largo de lo que realmente es. Como un simple ejemplo, si uno usa:Se cree que la solicitud tiene 8 caracteres y no 1. Como tal, si la ventana del terminal tiene 20 columnas, después de escribir 12 caracteres, se cree que tiene 20 y se ajusta. Esto también es evidente si uno intenta hacer retroceso o Ctrl+u. Se detiene en la columna 9.
Sin embargo, tampoco comienza una nueva línea a menos que haya una en la última columna, como resultado se sobrescribe la primera línea.
Si uno sigue escribiendo, la línea debe ajustarse a la siguiente línea después de 32 caracteres.
fuente
Se trata principalmente de que el tamaño de la ventana asumido por el terminal no es el mismo que el tamaño real de la ventana. Si está utilizando bash, puede probar esto.
Si no consigues
Luego actívelo con
Luego, simplemente intente ejecutar otro comando (como
ls
) o cambiar el tamaño de la ventana una vez, lo anterior funciona para mí cada vez.Para los sistemas Redhat en particular, el problema a menudo es causado por una configuración
~/.bashrc
incorrecta de no llamar/etc/bashrc
. Normalmente, bash carga lo~/.bashrc
que se espera que llame/etc/bashrc
, que por defecto contieneshopt -s checkwinsize
.fuente
/etc/bashrc
, todo lo demás era bueno ... resulta que esta es la causa de los problemas de ajuste.shopt -s checkwinsize
en la sesión ssh. Pero la envoltura persiste.Como se menciona en otras respuestas, las secuencias no imprimibles, como las
\e[0;30m
que se deben envolver\[...\]
.Además (y lo que no veo mencionado todavía) es que
\r\n
debería estar fuera de\[...\]
si tienes un mensaje de varias líneas. Me tomó algo de prueba y error finalmente resolver eso.fuente
Una vez leí en alguna parte (ya no sé dónde) que usando
\001
y en\002
lugar de\[
y\]
puedo resolver este problema. Lo hizo por mi.Por cierto, definir PS1 no tiene que verse feo.
fuente
Esto suena como un problema con sus
COLUMNS
yLINES
medio ambiente ajustes variables. Cuando cambia el tamaño de la ventana, generalmente se configuran automáticamente mediante gnome-terminal (creo), puede forzarlos a configurarse manualmente emitiendo el comandoresize
.Ejemplo
Si cambio el tamaño de mi terminal gnome a 79x17, mis variables se muestran así:
Puedo forzarlo así:
fuente
Para evitar el ajuste, también puede aumentar el número de columnas utilizando, por ejemplo,
fuente
También se puede causar el mismo problema al usar símbolos Unicode anchos (como https://stackoverflow.com/a/34812608/1657819 ). Aquí está el fragmento de la causa del problema (la mente el
$Green
y$Red
se escapó correctamente las cadenas de color):Bash no puede calcular la longitud correctamente, por lo que la forma más fácil podría ser escapar de 2 de las tres partes de esos símbolos anchos.
fuente
\001
y\002
.