Il più delle volte l'output di un comando termina con il carattere di nuova riga. Ma a volte no, quindi il prompt della shell successivo viene stampato sulla stessa riga insieme all'output.
Esempio:
root @ hostname [~] # echo -n ciao
helloroot @ hostname [~] #
L'ho sempre trovato molto fastidioso.
Ora, potrei semplicemente aggiungere un "\ n" all'inizio della variabile PS1, ma la maggior parte delle volte stamperà una riga aggiuntiva che non mi serve.
È possibile sapere se l'output dell'ultimo comando è terminato con una nuova riga o no?
Soluzione:
(grazie a Dennis)
PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '
$()
in un posto e backtick in un altro. Puoi usarli $()
in entrambi.
tput cols
perché genera comunque solo il valore della variabile COLUMNS, ed è più lento perché non è incorporato nella shell. Ti consigliamo anche di includere \e[K
(equivalente a tput el
) per eliminare lo spazio bianco inserito in modo da non ottenere un sacco di spazio bianco finale quando si copia e incolla nel caso predefinito. Infine, devi racchiudere tutta questa magia tra \[
e \]
altrimenti bash proverà a indovinare la posizione del tuo cursore e si incasinerà quando modifichi il tuo comando / cronologia.
PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '