Procura por um comando anterior com o prefixo que acabei de digitar

41

Podemos usar a seta para cima e para baixo para navegar no histórico de comandos.

Em alguns IDEs, como o Matlab, se inserirmos alguma coisa e pressionar as teclas de seta, rolamos apenas entre os comandos de histórico, começando com o que temos inserido. Isso é realmente conveniente, mas em um terminal de shell, isso não funciona.

Existe alguma maneira de ganhar uma função semelhante em um terminal de shell? E alguma outra dica para melhorar a eficiência no uso de terminais?

    
por Lee 23.09.2015 / 18:43

9 respostas

57

O que você está procurando é Ctrl R .

Digite Ctrl R e digite a parte do comando desejado. O Bash exibirá o primeiro comando correspondente. Continue digitando Ctrl R e o bash irá percorrer os comandos anteriores correspondentes.

Para pesquisar para trás no histórico, digite Ctrl S . (Se Ctrl S não funciona assim para você, isso provavelmente significa que você precisa desabilitar o controle de fluxo XON / XOFF: para fazer isso, execute stty -ixon . )

Isso está documentado em "Pesquisando" em man bash .

    
por 23.09.2015 / 18:57
21

Coloque-os no seu ~/.inputrc :

"\e[5~": history-search-backward
"\e[6~": history-search-forward

Estes fazem Page Up e Page Down se comportam como você deseja. (Algumas distribuições já o configuraram para você.) Eu pessoalmente acho isso muito mais conveniente do que Ctrl + R ou history .

    
por 23.09.2015 / 19:59
7

Além da pesquisa do histórico de ^ r / ^ s:

alt . insere a última "palavra" do comando anterior no cursor. Repita para obter a última palavra dos comandos mais antigos. (Mas observe que um & à direita conta como a última palavra para comandos em segundo plano).

Isso é muito útil para mkdir foo , cd alt-dot. Ainda mais rápido que a seta para cima, ^ a, alt-d (exclua a palavra para frente), cd .

Para obter a segunda e última palavra, use esc - 2 alt+. (use um argumento numérico no estilo emacs para alt+. . A contagem negativa começa a partir do final, a contagem positiva continua desde o início.) Mas isso geralmente é mais problemático do que vale a pena; em algum momento, é mais rápido acessar o mouse e copiar / colar, ou seta para cima e ^ w / ^ y parte dele (veja abaixo).

Se o seu terminal estiver configurado de forma adequada / adequada, ctrl-left e ctrl-right irá retroceder / avançar por palavras. Se não, esperamos que pelo menos o alt-b e o alt-f façam o mesmo.

ctrl- / é um desfazer. Você pode usar a repetição automática para excluir palavras com muito mais eficiência, se puder desfazer ao passar um pouco.

Uma mistura / combinação mais poderosa de comandos vem do uso do kill-ring, que funciona como no Emacs. ctrl-y para colar o último ctrl-w / ctrl-u / ctrl-backspace / alt-d. alt-y para percorrer o texto morto mais antigo.

Múltiplos ctrl-w ou o que for feito em uma linha na entrada do kill-ring. Use a seta para a esquerda e para a direita ou algo do tipo para dividir a entrada, se quiser remover duas coisas e colar apenas uma depois.

Combinando tudo isso junto, você pode

  • comece a digitar um comando
  • ctrl-r para voltar para um comando antigo e pegar parte dele com control-w ou similar.
  • esc-r ou alt+r para restaurar como era antes de excluir parte dele.
  • alt- > para ir até o final do histórico (ou seja, seta para baixo até o fim), para voltar ao comando no qual você estava no meio.

Outras dicas de uso interativo:

Ative o shopt -s globstar , para que você possa fazer **/*.c (recursivo, incluindo o diretório atual). Às vezes útil para uso interativo, mas geralmente find -name '*.c' -exec foo {} + é melhor.

Se você escrever scripts bash, você achará útil ter shopt -s extglob ativado em seus shells interativos também. Você irá algumas vezes encontrar um uso para coisas como *.!(c|h) para combinar arquivos que não terminem com .c ou .h.

Encontre os aliases que você gosta para ls -l , less e qualquer outra coisa que você faz muito. ( cp -i , mv -i e rm -I são bons. Não adquira o hábito de depender deles para fazer uma rm seletiva. GNU rm's - Eu pergunto de uma vez por todas os args .)

Eu gosto de alias m=less (m para "mais"). Eu tenho less configurado com , e . ligado ao arquivo anterior / próximo ( lesskey ). O padrão é uma seqüência de várias teclas que não pode ser usada com autorepeatação.

Eu gosto de fazer tudo dentro da tela do GNU. Eu acho mais fácil manter o controle de janelas de tela numeradas do que um carregamento de abas no Konsole (ou qualquer outro emulador de terminal que eu tentei). Se você ainda não conhece screen , aprenda o tmux porque é mais novo e menos crútico.

Para obter algo como a funcionalidade de abrir um novo shell com o mesmo cwd que outro shell, eu uso um gancho personalizado para cd / pushd / popd que me permite fazer cds 8 para cd para qualquer dir que meu shell na janela de tela 8 esteja usando. Isso funciona mesmo para shells fora da sessão de tela, contanto que haja apenas uma sessão de tela.

    
por 23.09.2015 / 23:44
5

Adicione as seguintes linhas ao seu ~/.inputrc

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

Isso é semelhante à resposta do egmont, mas ao invés de usar Page Up e Page Down, ele usa as seqüências de escape para Arrow Up e Arrow Down. Desta forma, é muito mais conveniente usar em um Mac.

    
por 03.11.2017 / 19:57
4

Eu sempre costumo configurar minhas máquinas com um grande valor HISTSIZE para manter uma lista de histórico mais longa, bem como HISTTIMEFORMAT com o valor do registro de data e hora para que eu possa ver quando o comando foi executado.

export HISTSIZE=10000
export HISTTIMEFORMAT="%m/%d/%Y %T "
    
por 23.09.2015 / 21:51
2

O meio que costumo usar é combinar o comando history com grep

IE:

history | grep <command im looking for>

Isso mostrará um histórico numerado dos comandos digitados que contêm esse comando, você pode usar:

!<number listed in history command>

para refazer esse comando.

IE:

history | grep history

142  history
143  history | grep lvresize
568  history | grep echo
570  history | grep echo
571  history | grep history

seguido por: !571

irá repetir history | grep history

    
por 23.09.2015 / 19:05
1

Eu usei diariamente 4 dicas (e algumas outras) no meu terminal bash:

  • Execute o último comando: !!

  • Execute o comando N do histórico: !N

  • Imprima o último comando a partir do prefixo do histórico: !prefix:p

  • Execute o último comando a partir do prefixo do histórico: !prefix

por 03.09.2018 / 17:01
1

Adicione o seguinte alias para ~ / .bashrc

alias h='history | awk '"'"'{$1="";print}'"'"' |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep'

Uso: "h fire" me dará uma lista de comandos contendo fogo. ou "h ^ fire" me dará uma lista de comandos começando com fogo.

Isso é útil quando quero ver uma série de comandos ao mesmo tempo.

A propósito, '' '' ' é feio, mas não consegui encontrar outras maneiras de evitar aspas simples entre aspas simples.

    
por 17.06.2016 / 03:03
0

Se não há problema em você usar zsh ao invés de bash você pode usar oh-my-zsh para isso.

Ele contém a seta para baixo na navegação pelo histórico de comandos. Permite também, a mesma navegação quando você já digitou texto (como Mathlab).

edit: Ele também contém outras coisas focadas no desenvolvedor, como aliases e temas. Esses extras tornam a distribuição maior e mais complexa de usar.

link

    
por 24.09.2015 / 05:44