Con base en la información que encontré aquí, pude descubrir una solución más simple para alinear a la derecha mientras acomodaba contenido de longitud variable a la derecha o izquierda, incluido el soporte para el color. Agregado aquí para su conveniencia ...
Nota sobre los colores: usar el \033
escape en favor de alternativas, sin \[\]
agrupaciones, resulta más compatible y por lo tanto recomendado.
El truco es escribir primero el lado derecho, luego usar el retorno de carro ( \r
) para volver al inicio de la línea y continuar sobrescribiendo el contenido del lado izquierdo encima de eso, de la siguiente manera:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
Estoy usando tput cols
Mac OS X para recuperar el ancho de terminal / consola terminfo
ya que mi $COLUMNS
var no está incluida env
pero puede sustituir el " *
" valor reemplazable %*s
, proporcionando " ${COLUMNS}
", o cualquier otro valor que prefiera.
El siguiente ejemplo se utiliza $RANDOM
para generar contenido de diferente longitud que incluye colores y muestra cómo puede extraer funciones para refactorizar la implementación a funciones reutilizables.
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
Dado que printf
supone que la longitud de la cadena es el número de caracteres que necesitamos para compensar la cantidad de caracteres necesarios para representar los colores, siempre se encontrará cerca del final de la pantalla debido a los caracteres ANSI no impresos sin compensación. Los caracteres requeridos para el color permanecen constantes y encontrará que también printf tiene en cuenta el cambio de longitud, tal como lo devuelve por $RANDOM
ejemplo ', que mantiene intacta nuestra alineación correcta.
Este no es el caso con las secuencias de escape pronta especial de bash (es decir. \u
, \w
, \h
, \t
), Sin embargo, ya que éstas sólo registrará una longitud de 2 a causa fiesta sólo se traducirá ellos cuando aparece el indicador, después de printf ha hecho que la cadena. Esto no afecta el lado izquierdo, pero es mejor evitarlos a la derecha.
Sin embargo, no tiene consecuencias si el contenido generado permanecerá en una longitud constante. Al igual que con la \t
opción de tiempo que siempre representará la misma cantidad de caracteres (8) durante 24 veces. Solo necesitamos tener en cuenta la compensación requerida para dar cabida a la diferencia entre 2 caracteres contados, lo que resulta en 8 caracteres cuando se imprime, en estos casos.
Tenga en cuenta que es posible que deba escapar tres veces de \\\
algunas secuencias de escape que, de lo contrario, tienen significado para las cadenas. Al igual que con el siguiente ejemplo, el escape del directorio de trabajo actual \w
no tiene ningún significado, por lo que funciona como se esperaba, pero el tiempo \t
, lo que significa un carácter de tabulación, no funciona como se espera sin que se escape primero primero.
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!