Com base nas informações que encontrei aqui, fui capaz de descobrir uma solução mais simples para alinhar à direita, acomodando conteúdo de comprimento variável à direita ou à esquerda, incluindo suporte para cores. Adicionado aqui para sua conveniência ...
Nota sobre cores: usar a \033fuga em favor de alternativas, sem \[\]agrupamentos, mostra-se mais compatível e, portanto, recomendado.
O truque é escrever primeiro o lado direito, depois usar return ( \r) para retornar ao início da linha e continuar a sobrescrever o conteúdo do lado esquerdo, como segue:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
Estou usando tput colsno Mac OS X para recuperar a largura do terminal / console, terminfojá que meu $COLUMNSvar não está preenchido, envmas você pode substituir o *valor " " substituível em %*s, fornecendo " ${COLUMNS}" ou qualquer outro valor de sua preferência.
O próximo exemplo usado $RANDOMpara gerar diferentes tamanhos de conteúdo inclui cores e mostra como você pode extrair funções para refatorar a implementação para funções reutilizáveis.
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
Como printfo comprimento da string é o número de caracteres que precisamos para compensar a quantidade de caracteres necessária para renderizar as cores, você o encontrará sempre aquém do final da tela por causa dos caracteres ANSI não impressos sem compensação. Os caracteres necessários para a cor permanecem constantes e você descobrirá que também printf leva em consideração a alteração no comprimento, conforme retornado por, $RANDOMpor exemplo, 'que mantém nosso alinhamento correto intacto.
Este não é o caso com sequências linha de escape Bash especial (ou seja,. \u, \w, \h, \t), Embora, uma vez que estes só irá gravar um comprimento de 2, porque festa só irá traduzir-los quando a solicitação é apresentada, após printf tornou a corda. Isso não afeta o lado esquerdo, mas é melhor evitá-los à direita.
No entanto, não importa se o conteúdo gerado permanecerá em comprimento constante. Como na \topção de hora, que sempre renderiza a mesma quantidade de caracteres (8) por 24 horas. Somente precisamos levar em consideração a compensação necessária para acomodar a diferença entre 2 caracteres contados, o que resulta em 8 caracteres quando impressos, nesses casos.
Lembre-se de que pode ser necessário triplicar o escape de \\\algumas seqüências de escape que, de outra forma, mantêm significado para as strings. Como no exemplo a seguir, o escape do diretório de trabalho atual \wnão tem significado, caso contrário, ele funciona conforme o esperado, mas o tempo \t, que significa um caractere de tabulação, não funciona como o esperado sem o escape triplo primeiro.
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!