Existe um comando para obter o bash para imprimir uma nova string de prompt e redesenhar a linha atual?

1

Em vez de esperar que os comandos lentos terminem, gostaria de executá-los em segundo plano. No entanto, quando eles terminam de executar e imprimem para stdout, eu recebo (onde representa meu cursor):

$ slowcmd &
$ cmd_output
█
  • Não há uma string de prompt antes do meu cursor.
  • e slowcmd podem ser qualquer comando lento (Para as coisas que eu tentei, eu acabei de dizer alias slowcmd='sleep 1 && echo cmd_output' )

Considerando que gostaria de algo assim:

$ slowcmd && redrawPromptString &
$ cmd_output
$ █

Onde após a saída do comando, uma nova sequência de prompts é impressa para mim.

O que posso fazer para fazer redrawPromptString fazer o que eu quero? Eu tentei clear , kill $$ enviar um ^C para o terminal e finalmente printf "^C" (claro que não funcionou). Eu estou correndo bash. (GNU bash, versão 3.2.57).

    
por Ari Sweedler 04.09.2018 / 00:06

2 respostas

1

Use a função redraw-current-line de bind builtin. Primeiro verifique se já está vinculado, talvez:

bind -q redraw-current-line

Eu nunca o vi ligado por padrão, então você provavelmente precisará vinculá-lo. Escolha uma combinação de teclas, digamos Ctrl + Y . Verifique se já foi tirado:

bind -p | grep -F '"\C-y'

Saída vazia significa que a combinação não é usada. Se sim, vamos ligar redraw-current-line a ele:

bind "\C-y":redraw-current-line

Agora, sempre que um processo de segundo plano bagunça sua linha de comando, pressione Ctrl + Y . Em seguida, seu prompt será redesenhado junto com qualquer comando que você tenha digitado parcialmente (se houver), para que você possa continuar como se nada tivesse acontecido.

Para tornar a ligação permanente, você pode adicionar o comando acima ao seu ~/.bashrc , mas não o faça. A abordagem correta é modificar ~/.inputrc (para usuário) ou /etc/inputrc (todo o sistema). Desta forma, qualquer programa que use readline(3) library irá obedecer. A linha a ser adicionada a qualquer arquivo é assim:

"\C-y":redraw-current-line

Mas se você criar ~/.inputrc novamente, verifique se a primeira linha diz $include /etc/inputrc . Isso porque, até esse momento, readline usou /etc/inputrc e talvez seu fluxo de trabalho dependa do conteúdo desse arquivo. De agora em diante, a biblioteca usará seu ~/.inputrc ; a linha $include /etc/inputrc faz com que ele analise também o arquivo do sistema.

Para mais informações, consulte help bind e man 3 readline .

    
por 05.09.2018 / 19:35
1

Se você pressionar Ctrl+L , ele fará parcialmente o que você deseja. Ele irá redesenhar a linha atual, incluindo tudo o que você digitou até o ponto, incluindo a posição do cursor, mas limpará a tela, então a saída anterior é perdida (ou no caso de uma janela de terminal no buffer de rolagem). Por outro lado, você estava disposto a experimentar clear , então talvez isso não seja um problema.

    
por 04.09.2018 / 00:47