Bash: ¿cómo saber si la salida del último comando termina con una nueva línea o no?

10

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]\$ '
Liberarse
fuente
Esto se debe mover al superusuario.
phaphink
Me gusta tu versión! Usaste $()en un lugar y retrocediste en otro. Puedes usar $()en ambos.
Pausado hasta nuevo aviso.
Lo sé. Pero para mí es más fácil leer de esa manera
GetFree
No lo usaría tput colsporque 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.
dlitz
1
Todo se puede hacer de la siguiente manera:PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
dlitz

Respuestas:

6

He estado experimentando con lo siguiente para emular la función desde zshBash:

$ unset PROMPT_SP; for ((i = 1; i <= $COLUMNS + 52; i++ )); do PROMPT_SP+=' '; done
$ PS1='\[\e[7m%\e[m\]${PROMPT_SP: -$COLUMNS+1}\015$ '

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 forse ejecute el ciclo ~/.bashrc. Es posible que desee shopt -s checkwinsizesi aún no está configurado.

Pausado hasta nuevo aviso.
fuente
Me pregunto por qué alguien rechazó cada respuesta . Hmmm ... no hay explicación. Que útil
Pausado hasta nuevo aviso.
Aquí hay otra forma, sin usar un bucle, para crear la cadena del pad:printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
pausa hasta nuevo aviso.
¿Qué es un "signo de porcentaje de video inverso"? La palabra "video" me ha confundido, y no he podido encontrar la respuesta en Google.
davidchambers
1
@davidchambers: el fondo del personaje se muestra en el color de primer plano y el personaje en sí se muestra en el color de fondo. Consulte man 5 terminfoy busque "video inverso" para ver documentación que utiliza esta terminología.
Pausado hasta nuevo aviso.
0

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.

Osito de peluche
fuente
Buena idea. El único problema es ... ¿es posible conocer la posición del cursor?
GetFree
0

zshintenta resolver tu problema Si la última salida finaliza sin una nueva línea, obtendrá:

$ echo -n 'abc'
abc%
$ 

Donde los %usos invierten el fondo / primer plano. No estoy seguro de si es portátil de bashalguna manera.

viraptor
fuente