Pesquise um comando anterior com o prefixo que acabei de digitar

Podemos usar as setas para cima e para baixo para navegar no histórico de comandos.

Em alguns IDEs, como Matlab, se inserirmos algo e, em seguida, pressionarmos as teclas de seta, percorremos apenas os comandos de histórico começando com o que inserimos. Isso é muito conveniente, mas em um terminal de shell, isso não funciona.

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

Comentários

  • Você pode simplesmente usar um shell que forneça tal recurso, como fish😉
  • @yoann você ‘ está assumindo que o bash não ‘ t . Faz, via readline, apenas não acessível por padrão.
  • @muru I ‘ estou ciente de CTRL + R em bash, e egmont ‘ A resposta fornece uma maneira elegante de fazer isso com Page Up / Page Down. No entanto, existe uma maneira de fazer isso com as teclas de seta?
  • @yoann verifique unix.stackexchange.com/a/76591/70524. Em vez de \e[5~ e \e[6~, use \e[A, \e[B.

Resposta

O que você está procurando é Ctrl R .

Digite Ctrl R e então digite parte do comando que deseja. O Bash exibirá o primeiro comando correspondente. Continue digitando Ctrl R e o bash percorrerá os comandos correspondentes anteriores.

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

Isso está documentado em “Pesquisando” em man bash.

Comentários

  • Ctrl-Q para sair do estado congelado, se você já pressionou Ctrl-S sem desligar o controle de fluxo primeiro e congelar seu terminal.

Resposta

Coloque-os em seu ~/.inputrc:

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

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

Comentários

  • Esta é a maneira mais conveniente em todas as respostas atuais. por favor, dê um pouco explicação sobre o mecanismo de funcionamento?
  • ~/.inputrc ou /etc/inputrc ou o arquivo referenciado pela variável de ambiente $INPUTRC é o arquivo de configuração de edição de linha de todos os aplicativos que usam readline, incluindo bash (seu shell). Ele possui certos recursos de edição de linha integrados, incluindo estes dois: na página de manual do bash ‘ s, procure uma dessas palavras-chave para descobrir mais. \e[5~ / \e[6~ são as sequências de escape geradas pelas teclas Page Up / Down na maioria dos emuladores de terminal; para vê-lo, inicie o comando cat e pressione essas teclas (o byte de escape é representado no terminal como ^[, em inputrc como \e).
  • O exemplo em sua pergunta original diz que as teclas Para cima / Para baixo funcionam dessa maneira no Matlab. Seria interessante ver o que aconteceu se você colocasse a sequência Up e Down em inputrc e atribuísse a esta ação; funcionaria corretamente ou teria efeitos colaterais desagradáveis, uma vez que entra em conflito com seu comportamento padrão. Não ‘ não sei, ‘ ficaria feliz em ouvir suas descobertas se você experimentar isso.
  • Quando eu faço echo $INPUTRC, ele está vazio. Eu ‘ estou usando Ubuntu 14.04
  • Pessoalmente, prefiro substituir as setas para cima e para baixo para fazer isso: "\e[A": history-search-backward e "\e[B": history-search-forward

Resposta

Além do histórico de ^ r / ^ s i -search:

alt . insere a última “palavra” do comando anterior no cursor. Repita para obter a última palavra de comandos mais antigos. (Mas observe que um & final conta como a última palavra para comandos em segundo plano).

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

Para obter a segunda à última palavra, use esc - 2 alt+. (ie use um argumento numérico no estilo emacs para alt+..Contagens negativas a partir do final, contagens positivas a partir do início.) Mas isso geralmente é mais problemático do que vale; em algum ponto, é mais rápido alcançar o mouse e copiar / colar ou seta para cima e ^ c / ^ y parte dele (veja abaixo).


Se o seu terminal estiver bem / apropriadamente configurado, ctrl-left e ctrl-right irão retroceder / avançar por palavras. Se não, espero que pelo menos alt-b e alt-f façam a mesma coisa.


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


Uma combinação / combinação mais poderosa de comandos vem do uso do kill-ring, que funciona assim 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 quer que seja em uma linha fazem a entrada do kill-ring. Use as setas para a esquerda e para a direita ou algo assim para dividir a entrada se quiser remover duas coisas e apenas colar uma depois.

Combinando tudo isso, você pode

  • comece a digitar um comando
  • ctrl-r para voltar a um comando antigo e pegue parte dele com control-w ou similar.
  • esc-r ou alt+r para restaurá-lo como estava antes de você excluir parte dele.
  • alt- > para ir para o fim da história (ou seja, seta para baixo até o fim), para voltar ao comando que estava no meio.

Outras dicas de uso interativo:

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

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

Encontre aliases de sua preferência para ls -l, less e tudo o mais que você fizer muito. (cp -i, mv -i e rm -I são legais. Não adquira o hábito de depender deles para fazer uma rm seletiva. GNU rm “s -I pede uma vez por todos os argumentos.)

Eu gosto de alias m=less (m para “mais”). Eu less configurei com , e . vinculado ao arquivo anterior / seguinte (lesskey). O padrão é uma sequência multi-keypress que não pode ser usada com repetição automática.


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

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 fazer cd para qualquer coisa dir meu shell na janela de tela 8 está usando. Isso funciona mesmo para shells fora da sessão de tela, desde que haja apenas uma sessão de tela.

Comentários

  • O meu não ‘ t parece estar ” configurado corretamente “. Muitos dos atalhos que vejo aqui não ‘ funcionam, estou usando o Terminal padrão do Ubuntu 14.04. Como posso configurá-lo?
  • @JorgeeFG: Acho que funcionou imediatamente com gnome-terminal no Ubuntu 14.04, antes de mudar para o KDE. A opção relevante está nas configurações do terminal, prefixo esc vs hig h-bit, e talvez algumas outras configurações. Alguns deles não ‘ não funcionam perfeitamente para mim por meio de ssh. (por exemplo, ctrl esquerda / direita munge o código de escape para a tecla de seta, e eu obtenho 5D aparecendo literalmente)

Resposta

Adicione as seguintes linhas ao seu ~/.inputrc

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

Isso é semelhante à resposta de egmont, mas em vez de usar Page Up e Page Down, ele usa as sequências de escape para Arrow Up e Arrow Down. Esta forma é muito mais conveniente para usar em um Mac.

Resposta

Sempre costumo configurar minhas máquinas com um grande HISTSIZE valor para manter uma lista de histórico mais longa, bem como HISTTIMEFORMAT com o valor do carimbo de data / hora assim Posso ver quando o comando foi executado.

export HISTSIZE=10000 export HISTTIMEFORMAT="%m/%d/%Y %T " 

Resposta

O meio que geralmente uso é combinar o history comando com grep

IE:

history | grep <command im looking for> 

Isso exibirá um histórico numerado de comandos que você digitou e 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

repetirá history | grep history

Comentários

  • CR = muito melhor + muito mais seguro
  • Talvez, pessoalmente, eu ache que um histórico canalizado para grep é um meio mais rápido de encontrar a maioria dos comandos. No que diz respeito a Safer, eu ‘ não tenho certeza do que você quer dizer, quais são os riscos inerentes ao uso da história em comparação com pesquisá-la com cR?
  • @ Gravy Suspeito que PSkocik significa que a ! substituição de histórico é menos segura.
  • @Gravy Os riscos inerentes seriam acidentalmente pegar a linha errada. Não tenho ideia de por que seu terminal travou, a menos que você tenha usado Control-S e tenha o controle de fluxo xon / xoff habilitado (geralmente o padrão). Nesse caso, Control-Q o trará de volta.
  • Concordo com @PSkocik, cr é muito melhor porque ‘ s mais fácil editar a linha do histórico, em vez de apenas executá-la novamente da mesma maneira. Executar exatamente o mesmo comando novamente é um caso trivial do que você pode fazer para economizar tempo, redigitando variações em linhas complexas ou completando tab um arquivo diferente em um longo caminho. Veja minha resposta.

Resposta

Usei 4 dicas diárias (e algumas outras) no meu terminal bash:

  • Execute o último comando: !!

  • Executar comando N do histórico: !N

  • Imprime o último comando começando com prefixo da história: !prefix:p

  • Execute o último comando começando com prefixo da história: !prefix

Comentários

  • Eu acho que usar o comando N do histórico é um dos os melhores caminhos para atirar no próprio pé para a maioria dos humanos 🙂 Basta dizer

Resposta

Se você pode usar zsh em vez de bash, você pode usar oh-mi-zsh por isso.

Você pode navegar no seu histórico de comandos com as setas para cima e para baixo. Também permite a mesma navegação quando você já digitou o texto (como em Mathlab).

edit: Oh-my-zsh é um grande pacote de software orientado para o desenvolvedor que inclui muitos outros recursos, por exemplo apelidos, temas, plug-ins. Esses extras tornam a distribuição mais complexa de usar do que um atalho de teclado.

https://github.com/robbyrussell/oh-my-zsh

Comentários

  • oh-my-zsh contém toneladas de coisas. Você também pode dizer: Este recurso exato está incluído naquela distro, quando tudo que você precisa é uma configuração ou aplicativo específico.
  • Editei a postagem: Eu avisei que é maior do que um aplicativo simples.

Resposta

Adicione o seguinte alias a ~ / .bashrc

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

Uso: h fire obterá uma lista de comandos contendo fogo . ou h ^fire obterá uma lista de comandos que começam com fire .

Isso é útil quando desejo visualizar 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.

Comentários

  • fyi – h="history | awk '{\$1=\"\"; print}' deve funcionar. Em alternativa, crie uma função e chame-a.
  • obrigado DarkHeart, mas tentei seu código, não funcionou no meu ambiente, talvez haja algo diferente no meu

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *