Selecionar comandos do histórico do bash

20

Pressionar o botão para cima é entediante e eu posso perder o comando que estava procurando. Portanto, ao digitar historyno terminal, todos os comandos que eu inseri antes foram indexados para um número. Existe alguma maneira de eu ligar para o número associado ao comando?

user182936
fonte
alguma opção mais interativa até agora? Estes são tão propenso a erros
mate

Respostas:

31

A história do bash pode fazer muitas coisas úteis, e a pesquisa Strg-rmencionada por Terry Wang é importante entre elas. Mas também é possível fazer exatamente o que você pediu.

Você pode refazer o comando anterior com !!. Com isso, você também pode editar o comando anterior. Se, por exemplo, você esqueceu de obter privilégios de root para um comando

apt-get install a-long-list-of-packages

você não precisa digitar tudo isso novamente. Em vez disso, basta ligar

sudo !!

Se você deseja executar novamente o comando em uma posição específica do seu histórico, também pode usar !, por exemplo

!3

para executar novamente o comando na posição 3. Lembre-se de que isso conta do topo. Portanto, se você estiver armazenando 500 comandos em seu histórico,!1 seria "500 comandos atrás". Você também pode usar números negativos. Por exemplo

!-2

executaria novamente o segundo último comando.

Você também pode executar novamente o último comando iniciado com uma sequência como

!apt-

o que refaz a última linha que começou com "apt-". Se você quiser o último comando em que a string apareceu em qualquer lugar da linha, use algo como

!?pt-ge

Há coisas mais interessantes que a história do bash pode fazer. Apenas para dar uma impressão da ampla gama de possibilidades, você pode acessar especificamente um parâmetro de um comando a partir do histórico. então

!-5:3:p

imprimiria o terceiro parâmetro no quinto do último comando.

EDIT: Com relação ao comentário de Rudie abaixo, com as configurações padrão, essas expansões do histórico do bash são realmente executadas diretamente. Provavelmente é melhor descrito assim: uma chamada como !-3é substituída pelo shell pelo terceiro último comando do seu histórico e, em seguida, sua entrada (com a substituição) é executada. Portanto, se você digitar !-3e pressionar ENTERe seu terceiro último comando for ls ~, é o mesmo que se você digitasse ls ~novamente e pressionasse ENTER"por conta própria".

Se você não quiser, pode definir a opção shell histverify. Para definir e desmarcar opções de shell, convém ler o shoptcomando. Com histverifyset, uma chamada como !-3apenas grava a substituição do seu histórico na linha de comando, mas não a executa diretamente. Assim, você deve pressionar o crucial ENTER- ou abster-se, se quiser.

Henning Kockerbeck
fonte
Então !é muito perigoso ... eu gostaria de saber o que !-4fez exatamente antes de executá-lo. Ou isso mostra primeiro? Resumo legal!
Rudie
11
@ Rudie Esse é um bom ponto, eu atualizei minha resposta. Os recursos do histórico destinam-se principalmente a acelerar o trabalho e a economizar as teclas digitadas. Então, um padrão "Você realmente, realmente quer dizer isso?" pelo menos parcialmente, derrotaria esse objetivo. E mesmo que você pudesse, normalmente você não chamará um comando "distante" como !-238. Não deve ser muito difícil lembrar o seu segundo último, terceiro último, talvez o último comando;) Como sempre no Linux (e, na verdade, com a computação em geral), é esperado que você saiba o que está fazendo. E se você realmente quer a rede de segurança adicional, é um shoptfora;)
Henning Kockerbeck
16

Sim existe. Se, por exemplo, você deseja executar o comando que possui o número 1234 ao lado, faça:

!1234

Outras coisas úteis:

  • Se você deseja executar o último comando executado, faça:

    !!
  • Se você deseja executar o último lscomando executado, faça:

    !ls
  • Se você acabou de executar ls /some/long/pathe deseja cd, faça:

    cd !$

Para maiores informações:

Alaa Ali
fonte
3

Se você encontrou o número do histórico de um comando e deseja executá-lo novamente, digite !seguido pelo número, por exemplo, !1234e pressione Enter. Isso faz parte da expansão da história ; você pode usar modificadores nele.

Se você deseja editar o comando antes de executá-lo, fc 1234 chama um editor externo.

Mas, como Terry Wang já mencionou , geralmente há maneiras mais rápidas de localizar um comando no histórico do que determinar seu número, incluindo Ctrl+ Rpara chamar a pesquisa incremental (pressione Enterquando você encontrar o comando que deseja executar) ou fc PREFIXpara executar o anterior. comando começando com PREFIX.

Gilles 'SO- parar de ser mau'
fonte
1

O historycomando mostrará todos os comandos e seus números associados. Se você quiser apenas fazer uma verificação rápida antes de executar a linha de comando # 135, digite:

echo !135

Isso mostrará o que será executado.

Bruce M
fonte