Com base nas informações que encontrei aqui, descobri uma solução mais simples para alinhar à direita, acomodando conteúdo de tamanho variável à direita ou à esquerda, incluindo suporte para cores. Adicionado aqui para sua conveniência ...
Observação sobre cores: usando o 3
escape em favor de alternativas, sem \[\]
agrupamentos, prova-se mais compatível e, portanto, recomendado.
O truque é escrever primeiro o lado direito, depois usar o retorno de carro ( \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 cols
no Mac OS X para recuperar a largura do terminal / console de terminfo
, pois meu $COLUMNS
var não está preenchido em env
, mas você pode substituir o valor substituível " *
" em %*s
, fornecendo " ${COLUMNS}
" ou qualquer outro valor de sua preferência.
O próximo exemplo usa $RANDOM
para gerar conteúdo de comprimento diferente incluindo cores e mostra como você pode extrair funções para refatorar a implementação para funções reutilizáveis.
function prompt_right() {
echo -e "3[0;36m$(echo ${RANDOM})3[0m"
}
function prompt_left() {
echo -e "3[0;35m${RANDOM}3[0m"
}
function prompt() {
compensate=11
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
Como printf
assume que o comprimento da string é o número de caracteres que precisamos para compensar a quantidade de caracteres necessária para renderizar as cores, você descobrirá que sempre falta no final da tela devido ao ANSI não impresso. personagens sem compensação. Os caracteres necessários para a cor permanecem constantes e você descobrirá que também o printf leva em conta a alteração no comprimento, conforme retornado por $RANDOM
por exemplo ', que mantém nosso alinhamento correto intacto.
Este não é o caso de seqüências especiais de escape de prompt bash (por exemplo, \u
, \w
, \h
, \t
), já que elas gravarão apenas um comprimento de 2 porque bash somente as traduzirá quando o prompt é exibido, depois que o printf renderiza a string. Isso não afeta o lado esquerdo, mas é melhor evitá-los à direita.
De nenhuma consequência se o conteúdo gerado permanecerá em tamanho constante. Como com o tempo \t
opção que sempre renderizará a mesma quantidade de caracteres (8) por 24 horas. Nós só precisamos levar em conta a compensação necessária para acomodar a diferença entre 2 caracteres contados, o que resulta em 8 caracteres quando impressos, nestes casos.
Lembre-se de que você pode precisar triplicar o escape \\
de algumas seqüências de escape que, de outra forma, possuem significado para strings. Como no exemplo a seguir, o diretório de trabalho atual escape \w
não tem nenhum significado, então funciona como esperado, mas o tempo \t
, que significa um caractere de tabulação, não funciona como esperado sem triplo escapar primeiro.
function prompt_right() {
echo -e "3[0;36m\\t3[0m"
}
function prompt_left() {
echo -e "3[0;35m\w3[0m"
}
function prompt() {
compensate=5
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
nJoy!