Na podstawie informacji, które tu znalazłem, byłem w stanie odkryć prostsze rozwiązanie do wyrównania do prawej strony, jednocześnie uwzględniając zawartość o zmiennej długości po prawej lub lewej stronie, w tym obsługę kolorów. Dodano tutaj dla Twojej wygody ...
Uwaga dotycząca kolorów: użycie \033ucieczki na rzecz alternatyw, bez \[\]grupowania, okazuje się najbardziej kompatybilne i dlatego jest zalecane.
Sztuczka polega na tym, aby najpierw napisać prawą stronę, a następnie użyć znaku powrotu karetki ( \r), aby powrócić na początek wiersza i kontynuować nadpisywanie zawartości lewej strony, następująco:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
Korzystam tput colsz systemu Mac OS X do pobierania szerokości terminala / konsoli, terminfoponieważ mój $COLUMNSvar nie jest wypełniony, envale możesz zastąpić wymienną *wartość „ ” w%*s , podając „ ${COLUMNS}” lub dowolną inną wartość, którą wolisz.
Następny przykład wykorzystuje $RANDOMdo generowania treści o różnej długości, zawiera kolory i pokazuje, w jaki sposób można wyodrębnić funkcje, aby przefakturować implementację do funkcji wielokrotnego użytku.
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
Ponieważ printfprzyjmujemy, że długość łańcucha jest liczbą znaków, którą musimy zrekompensować ilością znaków wymaganą do renderowania kolorów, zawsze znajdzie się on na końcu ekranu ze względu na niedrukowane znaki ANSI bez kompensacji. Znaki wymagane dla koloru pozostają stałe i przekonasz się, że również printf uwzględnia zmianę długości zwracaną przez$RANDOM na przykład przez ', co pozwala zachować właściwe wyrównanie.
Nie jest to przypadek szczególny bash sekwencji szybka ucieczka (tj. \u, \w, \h,\t ), Choć, jak będą one nagrywać tylko długość 2, ponieważ bash będzie tylko tłumaczyć je, gdy zostanie wyświetlony monit, po printf świadczył ciąg. Nie wpływa to na lewą stronę, ale najlepiej unikać ich po prawej stronie.
Bez żadnego znaczenia, jeśli wygenerowana treść pozostanie na stałej długości. Podobnie jak w przypadku \topcji time , która zawsze renderuje tę samą liczbę znaków (8) przez 24 godziny. Musimy jedynie uwzględnić kompensację wymaganą do uwzględnienia różnicy między zliczonymi 2 znakami, która w tych przypadkach daje 8 znaków po wydrukowaniu.
Należy pamiętać, że może być konieczne potrójne ucieczka \\\niektórych sekwencji ucieczki, które w przeciwnym razie mają znaczenie dla łańcuchów. Podobnie jak w poniższym przykładzie, bieżące escape katalogu roboczego \wnie ma żadnego znaczenia, w przeciwnym razie działa zgodnie z oczekiwaniami, ale czas \t, który oznacza znak tabulacji, nie działa zgodnie z oczekiwaniami bez potrójnego jego ucieczki.
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!