Com o BASH após "rolar" até um comando anterior ... como passar para o próximo nesta história?


59

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

Mas suponho que muitas pessoas tenham se perguntado isso, e minha pergunta pode ser uma bobagem ... tudo o que posso dizer é que não a encontrei.

Quando digo "rolando" para cima, quero dizer, usando a tecla "seta para cima" no teclado, que obviamente percorre o histórico, iniciando no comando mais recente.

Então você encontra um comando talvez 30 comandos de volta ... e você o executa. E então você deseja executar o comando que veio depois dele ... existe uma maneira rápida de fazer isso? Ou como os fluentes no BASH fazem isso?

Respostas:


96

A execução do comando com Ctrl+ em ovez de Enterexecutará um comando a partir do histórico e, em seguida, enfileirará o próximo em vez de retornar à frente do histórico do bash.


2
Eu apenas tentei isso no meu próprio bash executando um xterm no NetBSD, e não funciona! Existem configurações que podem influenciar isso? Não tenho arquivo .inputrc. Co não é mencionado na página de manual do readline (3).
Rhialto

@Rhialto Você está usando viedição de linha (ativada com set -o vi) ou emacs? Porque Ctrl-Onão vai funcionar com o primeiro, tanto quanto eu posso dizer.
Camada B

... mas isso pode ser corrigido com o comando: bind "\C-o":operate-and-get-next(ou adicione tudo depois bindde ~/.inputrc) #
B Layer

11
Descobri qual é o meu problema: ^ O é considerado o caractere Flush Output (não suportado no Linux) e a linha de leitura não desativa isso enquanto está ativo. Forneci um patch simples, mas o mantenedor do bash e do readline mantém que este não é um bug. Discordo. Veja lists.gnu.org/archive/html/bug-readline/2018-01/msg00004.html
Rhialto

19

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

O Bash inclui um comando fc, que assume como parâmetros os números de linha da lista do histórico do bash. Em seguida, abre o editor padrão com essas 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 edição que você pode querer fazer é anexar a todos, exceto a última linha, algo como "; read -p" next ... "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 definiu a variável bash HISTCONTROL para incluir erasedups, depois de executar C-oo usuário ficará confuso porque, em vez de o próximo comando esperado no histórico ser exibido, aquele depois disso será exibido. Isso ocorre porque o bash excluiu a instância original do comando executado e, portanto, todos os comandos posteriores mudaram uma linha, ie. para um número de índice inferior na lista do histórico.


obrigado, ao tentar encontrar a resposta pesquisando, encontrei o comando "fc". Para mim, isso representa o próximo estágio nos lentos passos de um neófito do BASH ao longo do caminho da glória em direção ao CONHECIMENTO. Eu queria o primeiro passo de bebê.
mike roedor

3
@mikerodent Não. Então, acontece fcantes de si Ctl-oe de bashsi mesmo. (Ao contrário do que esta resposta também é menos útil.)
kubanczyk

11
O problema com erasedupsé claramente um bug do bash ( poderia haver provisão para essa situação). É bom saber, no entanto.
22418 Alexis

2
@kubanczyk Isso está em debate. Se for um comando complexo e complicado, dependendo do que precisa ser corrigido, seria muito mais rápido usar meu editor de escolha para atualizar o comando. Também seria mais fácil.
Pryftan

14

Outra maneira de realizar seu comportamento desejado seria de se familiarizar com os atalhos do bash readline (dos quais CTRL- oé um que eu acredito) e pesquisando a história bash.

Pesquisa de histórico

CTRL- rleva você à pesquisa do histórico de comandos do bash, onde você pode começar a digitar o comando que está procurando e o bash completará automaticamente o comando para você. A funcionalidade de preenchimento automático é realmente muito boa. Quando o comando que você deseja executar estiver na linha de entrada, você poderá ENTERexecutá-lo ou pressionar CTRL- epara mover o cursor até o final da linha de comando e sair do modo de pesquisa de histórico.

O legal de CTRL- eneste momento é que o buffer do histórico é definido contextualmente para este comando. Os comandos seguintes e anteriores agora são os executados imediatamente antes e depois da linha que a pesquisa de 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 no histórico pode economizar muito tempo pesquisando manualmente no histórico e, em seguida, você pode prosseguir CTRL- ocomo Jon apontou acima.

Readline Short Cuts

Se você deseja aumentar o seu bash-fu geral, recomendo dar uma chance aos atalhos da linha de leitura das teclas de seta. Você pode achar que eles são mais convenientes e permitem aumentar sua velocidade de digitação, mas é claro o YMMV. Aqui estão mais alguns:

  1. CTRL- npara o próximo comando (equivalente na seta para baixo)
  2. CTRL- ppara o comando anterior (seta para cima equivalente)
  3. CTRL- bretornar um caractere (equivalente à seta à esquerda)
  4. CTRL- fencaminhar um caractere (equivalente à seta à direita)

Esses atalhos readline (juntamente com CTRL- ao início da linha e CTRL- efim de linha) irá aumentar a sua velocidade e eficiência na linha de comando imo.


2
Eu não sei. Acho que o uso das teclas modificadoras é mais lento que as setas ou qualquer outra tecla pressionada. Quanto à EOL / etc. Eu costumo usar as teclas home / end (stty -a mostra algumas coisas bastante úteis também, é claro).
Pryftan

@Pryftan Fair, a última frase é apresentada como uma opinião (veja 'imo'). Acredito que permanecer na linha inicial do teclado a longo prazo é uma boa estratégia para trabalhar no terminal ou qualquer outra tarefa de digitação intensiva. Algumas pessoas têm teclados em que as teclas de seta estão mais próximas dos outros caracteres; nesse caso, talvez os atalhos da linha de leitura não sejam uma conveniência atraente. Vou editar a resposta para tornar esse último ponto mais claramente uma declaração de opinião.
111 ---

11
@datUser Tbh ​​Eu perdi o 'imo' (ou, se não o fiz, deixei de considerá-lo - totalmente possível). O que é verdade, porém, é que a pesquisa inversa é útil (tenha um +1) se funcionar para você. Claro que fc também é algo (como já foi mencionado) e o mesmo está sendo usado! (etc.) Muitas maneiras de esfolar um gato nos Unices. Quanto aos teclados, isso também é verdade: eu tenho um teclado Unicomp (adoro e traz lembranças), mas é claro que existem outros teclados a serem considerados, sem mencionar o Dvorak. No final, quanto mais opções você tiver, melhor estará e mais fácil será o seu trabalho (ou lazer) :) #
1016
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.