Bash: como saber se a saída do último comando termina com uma nova linha ou não?

9

Na maioria das vezes, a saída de um comando termina com o caractere de nova linha. Mas às vezes isso não acontece, então o próximo prompt do shell é impresso na mesma linha junto com a saída.

Exemplo:

root@hostname [~] # echo -n hello
helloroot@hostname [~] #

Eu sempre achei isso muito chato.
Agora, eu poderia simplesmente adicionar um "\ n" no começo da variável PS1, mas na maioria das vezes isso vai 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]\$ '
    
por GetFree 27.12.2009 / 00:50

3 respostas

6

Eu tenho feito experiências com o seguinte para emular o recurso de zsh no Bash:

$ unset PROMPT_SP; for ((i = 1; i <= $COLUMNS + 52; i++ )); do PROMPT_SP+=' '; done
$ PS1='\[\e[7m%\e[m\]${PROMPT_SP: -$COLUMNS+1}5$ '

Emite um sinal de porcentagem de vídeo invertido, seguido por vários espaços para torná-lo na próxima linha, depois um retorno de carro, seguido por um sinal de dólar e um espaço. Você pode adicionar um prompt de escape após o "\ 015" para personalizar o seu prompt.

Usar isso depende de como o terminal lida com quebra de linha de margem direita (margens automáticas). O comprimento de PROMPT_SP é arbitrário, mas deve ser pelo menos 80 ou qualquer que seja sua largura de terminal usual. Pode ser necessário codificar esse valor se $ COLUMNS ainda não estiver definido quando o ciclo for for executado em ~/.bashrc . Você pode querer shopt -s checkwinsize se ainda não estiver definido.

    
por 27.12.2009 / 10:26
0

Não, não é possível. O próprio Bash não processa ou vê a saída do programa que iniciou.

Ocorreu-me que poderia ser possível escrever um programa para definir PROMPT_COMMAND para, o que iria verificar a posição atual do cursor e emitir uma nova linha se o cursor não estivesse em a borda esquerda.

    
por 27.12.2009 / 03:56
0

zsh tenta resolver seu problema. Se a última saída terminar sem uma nova linha, você receberá:

$ echo -n 'abc'
abc%
$ 

Onde o % usa fundo invertido / primeiro plano. Não tenho certeza se é portável para bash de qualquer forma.

    
por 27.12.2009 / 04:06