La mayoría de las veces, la salida de un comando termina con el carácter de nueva línea. Pero a veces no lo hace, por lo que el siguiente indicador de shell se imprime en la misma línea junto con la salida.
Ejemplo:
root @ hostname [~] # echo -n hola
helloroot @ hostname [~] #
Siempre me ha parecido muy molesto.
Ahora, podría agregar un "\ n" al comienzo de la variable PS1, pero la mayoría de las veces imprimirá una línea adicional que no necesito.
¿Es posible saber si la salida del último comando terminó con una nueva línea o no?
Solución:
(Gracias a Dennis)
PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '
$()
en un lugar y retrocediste en otro. Puedes usar $()
en ambos.
tput cols
porque de todos modos solo genera el valor de la variable COLUMNS, y es más lento porque no es un shell incorporado. También querrá incluir \e[K
(equivalente a tput el
) para eliminar el espacio en blanco insertado para que no obtenga un montón de espacio en blanco al copiar y pegar en el caso predeterminado. Finalmente, debes encerrar toda esta magia entre \[
y, de lo \]
contrario, bash intentará adivinar la posición de tu cursor y se dañará cuando edites tu comando / historial.
PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '