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 atput 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]\$ '
Respuestas:
He estado experimentando con lo siguiente para emular la función desde
zsh
Bash:Emite un signo de porcentaje de video inverso, seguido de un montón de espacios para que se ajuste a la siguiente línea, luego un retorno de carro, seguido de un signo de dólar y un espacio. Puede agregar mensajes de escape después de "\ 015" para personalizar su mensaje.
Usar esto depende de cómo su terminal maneja el ajuste de la línea del margen derecho (márgenes automáticos). La longitud de PROMPT_SP es arbitraria, pero debe ser de al menos 80 o el ancho de terminal habitual. Es posible que deba codificar ese valor si $ COLUMNS aún no está configurado para cuando
for
se ejecute el ciclo~/.bashrc
. Es posible que deseeshopt -s checkwinsize
si aún no está configurado.fuente
printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
man 5 terminfo
y busque "video inverso" para ver documentación que utiliza esta terminología.No, no es posible. Bash en sí no procesa ni ve la salida del programa que ha iniciado.
Se me ocurrió que podría ser posible escribir un programa para configurarlo
PROMPT_COMMAND
, que verificaría la posición actual del cursor y emitiría una nueva línea si el cursor no estuviera en el borde izquierdo.fuente
zsh
intenta resolver tu problema Si la última salida finaliza sin una nueva línea, obtendrá:Donde los
%
usos invierten el fondo / primer plano. No estoy seguro de si es portátil debash
alguna manera.fuente