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 \033
fuga 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 cols
no Mac OS X para recuperar a largura do terminal / console, terminfo
já que meu $COLUMNS
var não está preenchido, 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 usado $RANDOM
para 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 printf
o 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, $RANDOM
por 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 \t
opçã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 \w
nã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!