Como posso recuperar um comando de histórico numerado para edição?

17

Frequentemente procuro alterações com history | grep 'string'

Eu recebo uma lista de comandos no meu histórico, juntamente com o número da linha do histórico), por exemplo

history | grep 'git'

  755  git status
 1535  git push origin master
 1570  git merge origin/one-146
 1667  git reset --hard origin/master

Agora posso recuperar e executar um comando de uma só vez !nnn, por exemplo:

!755
git status
# On branch master
nothing to commit, working directory clean

Minha pergunta é: como posso recuperar um comando de histórico numerado e permanecer na linha de comandos para edição e não executá-lo imediatamente 'como está', da maneira que !faz, para que eu possa alterar algumas coisas ao executar o retorno presing?

Michael Durrant
fonte

Respostas:

12

Desde então, adotei outra abordagem para isso - usando ![line-number]:p

Isso imprime a instrução e a adiciona ao histórico, mas na verdade não é executada. Em seguida, levanto a seta e altero-a conforme desejado.

Combino isso com meu hgalias ( alias hg='history | grep ') para recuperar os comandos do histórico com base em algum texto.

Exemplo:

$ hg checkout

17140   git checkout README.rdoc
17143   git checkout master
17201   git checkout README.rdoc
17204   git checkout master
17923   git checkout .bashrc
18151   git checkout v311

Eu uso isso além de ctrl- r(pesquisa de histórico reverso) porque às vezes eu prefiro ver uma lista imediata de todas as possibilidades para uma determinada string, em vez de apenas a saída em uma linha que ctrl+ rmostra. Depois, hg [string]eu faria ![line-number]search_stringcomo hg checkoutmostrado acima.

Michael Durrant
fonte
8

Se você definir a histverify opção , por exemplo

shopt -s histverify

todas as substituições do histórico são apresentadas para edição, em vez de serem executadas imediatamente. Você precisaria pressionar Enterduas vezes em vez de digitar !755para executar o comando.

Você pode enviar texto arbitrário para a lista do histórico com history -s. Combine isso com fc -nlpara listar uma entrada específica no histórico.

history -s "$(fc -nl 755 755)"

pressione Uppara recuperar o que agora é a entrada mais recente do histórico.

Gilles 'SO- parar de ser mau'
fonte
6

Você pode pesquisar no histórico usando Ctrl+R . Se a entrada do histórico for longa, use o mouse (não o teclado, que interrompe a pesquisa) para copiar e colar parte do comando para editar novamente.

Como o @rijsg comentou, você pode usar as setas (esquerda e direita) ou teclas equivalentes para interromper a pesquisa e começar a editar.

Zelda
fonte
2
Qualquer tecla de seta ou comando equivalente ( Ctrl-apor exemplo) interromperá a pesquisa, deixando a entrada do histórico atual no prompt de comando, sem executá-la. Isso pode ou não ser suficiente, dependendo do que @Michael quiser.
njsg
2

Se você configurar o arquivo .bashrc para usar o editor vi na linha de comando, as edições da linha de comando serão muito menos complexas.

Primeiro, quando o "set -o vi" estiver ativado, você pode simplesmente pressionar "<esc> k" e continuar pressionando "k" para subir o arquivo de histórico como se fosse, se você passar por uma entrada, use "j" descer .

NOTA: ao usar o vi, existem dois modos: comando e edição para entrar no modo de comando, pressione a tecla ESCAPE UMA VEZ e, em seguida, a, A, i, I etc. para inserir.

Simples cursor pad no vi: esquerda = h, baixo = j, cima = k, direita = l http://linuxmeister.net/vi/vi-Summary.jpg

Adicionei todas as entradas necessárias para fazer isso funcionar em: http://linuxmeister.net/Notes/bashrc-simple.html

Portanto, com base nas informações muito úteis acima, pude usar o "history" e RECALL uma linha do "history", sem executá-lo. (OBRIGADO POR ESSE POST!)

se shopt estiver listado e histverify estiver "desativado" a! EXECUTAR imediatamente,

se você adicionou ao seu .bashrc ou digitou: shopt -s histverify , então a! permite uma edição, por exemplo:

history
    1  more .bashrc
    2  history
    3  shopt
    4  . ./.bashrc
    5  shopt | grep hist
    6  history
    7  alias
    8  history
    9  shopt
   10  history

->! 5

quando eu bati! 5 o seguinte comando aparece, mas NÃO executa

### se histverify estiver "ativado".

shopt | grep hist
cmdhist         on
histappend      on
histreedit      off
histverify      on
lithist         off

Lembre-se de que Linus e Richard criaram ferramentas Linux e GNU para aproveitar o UNIX. O editor vi (criado por Bill Joy) é uma das melhores ferramentas para dominar, assim como em TODAS as distribuições do UNIX e Linux.

Todos os outros editores de linha de comando precisam ser carregados e requerem software adicional. Usar uma GUI no Linux (que não seja Firefox, Thunderbird e OpenOffice) é como rebocar seu Diesel 4x4 com um VW Beetle 1968 ... funcionará, mas com certeza não faz sentido.

Lembre-se do que Kernigan disse sobre uma GUI, "o que você vê é tudo o que obtém".

LinuxMeister
fonte
-1
echo !number

pressione a seta para cima, remova a palavra echoe edite o restante; pressione enter para executar.

Andrzej
fonte