Na maioria das vezes, a saída de um comando termina com o caractere de nova linha. Mas, às vezes, não, portanto, o próximo prompt do shell é impresso na mesma linha junto com a saída.
Exemplo:
root @ hostname [~] # echo -n Olá
helloroot @ hostname [~] #
Eu sempre achei isso muito chato.
Agora, eu poderia apenas adicionar um "\ n" no início da variável PS1, mas na maioria das vezes isso imprimirá uma linha extra que eu não preciso.
É possível saber se a saída do último comando terminou com uma nova linha ou não?
Solução:
(Graças a Dennis)
PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '
$()
em um lugar e backticks em outro. Você pode usar $()
em ambos.
tput cols
porque apenas gera o valor da variável COLUMNS de qualquer maneira, e é mais lento porque não é um shell embutido. Você também deseja incluir \e[K
(equivalente a tput el
) para excluir o espaço em branco inserido, para que você não tenha muitos espaços em branco à direita ao copiar e colar no caso padrão. Por fim, você precisa incluir toda essa mágica entre \[
e \]
ou o bash tentará adivinhar a posição do cursor e isso atrapalhará quando você editar seu comando / histórico.
PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '