Descubra qual comando eu executei pela última vez e que começa de uma certa maneira?

8

No ambiente de linha de comando do bash, você pode !!executar novamente o último comando. E você pode pressionar a seta para cima para ver o último comando que você executou. Mas e se você quiser apenas ver, mas não executar, o último comando executado que começou de uma certa maneira?

bernie2436
fonte
1
Você poderia modificar sua pergunta. Ainda não estou claro o que você está perguntando.

Respostas:

18

Se você pesquisar no histórico via Ctrl+ re digitar algumas letras do comando e não pressionar, Entermas pressionar , o comando será exibido e não será executado. Outra alternativa é:

history | grep 'mycommand'

Este bom truque de história também pode ajudar.

mkc
fonte
1
E se você não está procurando a primeira correspondência e deseja continuar pesquisando para trás, pressione ctrl-r várias vezes. E este é apenas um dos muitos comandos poderosos fornecidos pela biblioteca de histórico e leitura de linhas do bash.
orion
Considerando que você tem a resposta verificada, eu puxarei a minha e, se você quiser usar a "^.\{7\}pattern"expressão em sua resposta, poderá fazê-lo!
se você quiser editar vários comandos e executar novamente a eles que você também pode usarfc ### ###
kiwy
9

Você pode mostrar o último comando executado, acrescentando :pa !!:

$ echo 123
123
$ !!:p
echo 123

Se você deseja que o último comando show seja executado com determinado nome, use uma exclamação:

$ echo 123
123
$ pwd
/home/cuonglm
$ !echo:p
echo 123
cuonglm
fonte
4

Todas as respostas aqui, até onde eu sei, não são portáteis. Para uma opção portátil, considere o POSIX garantido fc:

    $ man fc

-E editor Use o editor nomeado pelo editor para editar os comandos. A string do editor é um nome de utilitário, sujeito a pesquisa através davariável PATH ... O valor navariável FCEDIT deve ser usado como padrão quando −e não for especificado. Se FCEDIT for nulo ou não definido , ed será usado como editor.

−l (A letra ell.) Liste os comandos em vez de chamar um editor neles. Os comandos devem ser escritos na sequência indicada pelo primeiro e último operandos, conforme afetados por -r , com cada comando precedido pelo número do comando.

-N Suprime os números de comando ao listar com -l .

-R Inverte a ordem dos comandos listados (com -l ) ou editados (com nem -l nem -s ) .

−s Execute novamente o comando sem chamar um editor.

OPERANDO

primeiro , último Selecione os comandos para listar ou editar. O número de comandos anteriores que podem ser acessados ​​deve ser determinado pelo valor davariável HISTSIZE . O valor do primeiro ou do último ou de ambos deve ser um dos seguintes:

[+ or-] number Um número positivo (ou negativo ) que representa um número de comando; os números de comando podem ser exibidos com aopção -l ... Por exemplo, -1 é o comando imediatamente anterior ...

Quando a opção -l é usada para listar comandos, o formato de cada comando na lista deve ser o seguinte:

    "%d\t%s\n", <line number>, <command>

Se as opções -l e -n forem especificadas, o formato de cada comando será:

    "\t%s\n", <command>

Se o consiste em mais de uma linha, as linhas após a primeira devem ser exibidas como:

    "\t%s\n", <continued-command>

Mas certifique-se de usar -l ou -e se você SOMENTE deseja ver / editar seus comandos. Por padrão fc, abrirá a lista de comandos solicitada no FCEDIT (observe que é diferente da sua variável de ambiente EDITOR ) e, quando o FCEDIT terminar , fcexecutará os comandos editados.

De qualquer forma, especificamente a resposta a esta pergunta pode ser:

    % fc -l -1

Ou sem números de linha:

    % fc -ln -1

Ou os últimos cinco comandos na ordem inversa:

    % fc -lrn -1 -5

No seu pager:

    % fc -lrn -1 -5 |$PAGER

Para sua última chamada para fc:

    % fc -l fc
mikeserv
fonte
+1 por esforço. No entanto, a questão é marcado festa
grebneke
Funciona bashe tudo mais. O uso de bashnão impede a portabilidade, mas certamente o desenvolvimento de maus hábitos o fará.
mikeserv
A melhor resposta aqui e deve ser a aceita, por conta da portabilidade.
Wildeyes
2

pressione Ctrlre comece a digitar o comando que deseja ver. bash será concluído gradualmente. Quando estiver satisfeito, pressione Enterpara executá-lo novamente ou Ctrlgabortar.

Glenn Jackman
fonte
2

Se você deseja apenas o último comando, use:

 history | cut -c 8- | tail -n 2 | head -n 1 

Se você quiser fazer isso repetidamente, coloque um espaço antes historyou use:

 history | cut -c 8- | grep -Ev '^history' | tail -n 1

Se você deseja apenas ver o último comando começando com padrão xyz:

 history | cut -c 8- | grep -E '^xyz'  | tail -n 1 

Mas isso não funciona se o padrão for os caracteres iniciais da 'história' e você precisará de algo como:

history | cut -c 8- | grep -Ev 'history \|' | grep -E '^hist'  | tail -n 1 
Anthon
fonte
Há um erro de digitação no seu primeiro uso de cut.
jon
1
bind '"\ep": history-search-backward'
bind '"\en": history-search-forward'

E então você pode inserir algum texto e, em seguida, Alt-pprocurar os últimos comandos que iniciam o mesmo (e Alt-p, Alt-nalternar entre eles).

(Essas são as ligações de teclas padrão para widgets semelhantes zsh)

Stéphane Chazelas
fonte
0

Adicione estas linhas em um arquivo ~/.inputrc:

"\e[A": history-search-backward
"\e[B": history-search-forward

Em seguida, source ~/.inputrcno seu shell (ou apenas reinicie o shell).

Agora você pode digitar algumas letras do comando e, em seguida, usar as setas para cima / para baixo para percorrer os comandos que começam com essas poucas letras.

wim
fonte