Sulla base delle informazioni che ho trovato qui sono stato in grado di scoprire una soluzione più semplice per l'allineamento a destra, adattando al contempo il contenuto a lunghezza variabile a destra o a sinistra, incluso il supporto per il colore. Aggiunto qui per comodità ...
Nota sui colori: l' utilizzo \033dell'evasione a favore di alternative, senza \[\]raggruppamenti, risulta il più compatibile e quindi consigliato.
Il trucco è di scrivere prima il lato destro, quindi utilizzare il ritorno \ra capo ( ) per tornare all'inizio della riga e continuare a sovrascrivere il contenuto del lato sinistro sopra, come segue:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
Sto usando tput colssu Mac OS X per recuperare la larghezza del terminale / console dal terminfomomento che il mio $COLUMNSvar non è popolato envma puoi sostituire il " *" valore sostituibile %*s, fornendo " ${COLUMNS}", o qualsiasi altro valore che preferisci, invece.
L'esempio seguente utilizza $RANDOMper generare contenuti di diversa lunghezza, compresi i colori e mostra come è possibile estrarre funzioni per trasformare l'implementazione in funzioni riutilizzabili.
function prompt_right() {
echo -e "\033[0;36m$(echo ${RANDOM})\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m${RANDOM}\033[0m"
}
function prompt() {
compensate=11
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
Poiché printfsupponiamo che la lunghezza della stringa sia il numero di caratteri che dobbiamo compensare per la quantità di caratteri richiesti per il rendering dei colori, la troverai sempre a corto di fine schermo a causa dei caratteri ANSI non stampati senza compensazione. I caratteri richiesti per il colore rimangono costanti e scoprirai che anche printf tiene conto del cambio di lunghezza, come restituito $RANDOMper esempio ', che mantiene il nostro giusto allineamento in tatto.
Questo non è il caso con particolare bash sequenze di escape rapida (es. \u, \w, \h, \t) Se, come questi saranno registrare soltanto una lunghezza di 2 perché bash tradurrà solamente quando viene visualizzata la richiesta, dopo printf ha reso la stringa. Ciò non influisce sul lato sinistro, ma è meglio evitarli a destra.
Non ha alcuna conseguenza se il contenuto generato rimarrà comunque costante. Come con l' \topzione time che renderà sempre la stessa quantità di caratteri (8) per 24 volte. Abbiamo solo bisogno di considerare la compensazione richiesta per tener conto della differenza tra 2 caratteri contati che risulta in 8 casi quando viene stampato, in questi casi.
Tieni presente che potresti dover triplicare \\\alcune sequenze di escape che altrimenti hanno significato per le stringhe. Come nell'esempio seguente, l'attuale escape della directory di lavoro \wnon ha alcun significato, quindi funziona come previsto, ma il tempo \t, che significa un carattere di tabulazione, non funziona come previsto senza prima averlo salvato tre volte.
function prompt_right() {
echo -e "\033[0;36m\\\t\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m\w\033[0m"
}
function prompt() {
compensate=5
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
nJoy!