Com BASH depois de “rolar” até um comando anterior… como então passar para o próximo nesta história?

58

Desculpas, este título não é o mais elegante que eu já inventei.

Mas eu suponho que muitas pessoas já se perguntaram isso, e minha pergunta pode ser um engano ... tudo o que posso dizer é que não encontrei.

Quando eu digo "rolagem" para cima, quero dizer, usando a tecla "seta para cima" no teclado, que, obviamente, rola você através do histórico, começando pelo comando mais recente.

Então você encontra um comando de 30 comandos ... e você o executa. E então você quer rodar o comando que originalmente veio depois dele ... existe uma maneira ágil de fazer isso? Ou como aqueles fluentes em BASH fazem isso?

    
por mike rodent 14.01.2018 / 16:59

3 respostas

96

Executar o comando com Ctrl + o em vez de Enter executará um comando do histórico e colocará na fila o próximo em vez de retornar para a frente da história do bash.

    
por 14.01.2018 / 17:02
18

A resposta de Jon Reinhold é ótima, mas há uma muito mais poderosa solução que vou sugerir. Eu também tenho um comentário sobre uma pegadinha em A resposta de Jon, mas eu não tenho reputação suficiente para poder comentar diretamente, então @Jon Reinhold, se você ler isso, por favor, comente para você abaixo.

Bash inclui um comando fc , que aceita como números de linha de parâmetros da lista do histórico bash. Em seguida, ele abre seu editor padrão com aqueles linhas como texto. Nesse ponto, você pode opcionalmente editar as linhas. Então, quando você sai do editor, o bash executa essas linhas!

Um exemplo de uma edição que você pode querer fazer é anexar a todos, menos o última linha algo como "; leia -p" próximo ... ". Isso fará com que o bash execute cada linha e avise antes de continuar.

Comentário para Jon Reinhold: Ótima resposta, mas você deve qualificá-la porque se o usuário tiver definido a variável bash HISTCONTROL para incluir erasedups , depois de executar C-o , o usuário ficará confuso porque em vez do próximo comando esperado na história sendo exibido, aquele depois disso será exibido. Isso é porque o bash excluiu a instância original do comando executado e, portanto, todos os comandos depois mudaram uma linha, ie. para um menor número de índice na lista de histórico.

    
por 14.01.2018 / 17:28
14

Outra maneira de realizar o seu comportamento desejado seria se familiarizar com os atalhos de linha de leitura bash (dos quais CTRL - o é um que eu acredito) e busca de histórico bash.

Pesquisa de histórico

CTRL - r leva você para a busca do histórico de comandos bash, onde você pode começar a digitar o comando que está procurando e o bash completará automaticamente o comando para você. A funcionalidade autocomplete é realmente muito boa. Quando o comando que você quer executar está na linha de entrada, você pode ENTER executar o comando, ou pressionar CTRL - e para mover o cursor para o final da linha de comando e sair do modo de pesquisa do histórico.

A coisa legal com CTRL - e neste momento é que o buffer de histórico é definido contextualmente para este comando. Os próximos e anteriores comandos agora são os que foram executados antes e depois da linha que a pesquisa do histórico localizou para você. Você pode pressionar as setas para cima ou para baixo e pegar o próximo comando.

A pesquisa de histórico é muito poderosa e uma ótima maneira de evitar o uso da seta para cima para voltar ao comando em primeiro lugar. Uma pesquisa rápida de histórico pode salvar lotes de tempo manualmente pesquisando através do histórico e então você pode prosseguir com CTRL - o como Jon apontou acima.

Readline Short Cuts

Se você está querendo melhorar seu bash-fu geral, eu recomendo dar uma chance aos atalhos de readline para as teclas de seta. Você pode achar que eles são mais convenientes e permitem aumentar sua velocidade de digitação, mas é claro que YMMV. Aqui estão mais alguns:

  1. CTRL - n para o próximo comando (seta para baixo equivalente)
  2. CTRL - p para o comando anterior (seta para cima)
  3. CTRL - b retorna um caractere (seta para a esquerda equivalente)
  4. CTRL - f encaminha um caractere (seta direita equivalente)

Estes atalhos de linha de leitura (junto com CTRL - a iniciam de linha e CTRL - e fim de linha ) aumentará sua velocidade e eficiência na linha de comando imo.

    
por 15.01.2018 / 21:59