Estou usando o Ubuntu 21.10. Se eu errar, posso executar novamente o último comando com !!
. Aqui está um exemplo:
$ apt update
Reading package lists... Done
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
W: Problem unlinking the file /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permission denied)
W: Problem unlinking the file /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permission denied)
$ sudo !!
sudo apt update
[sudo] password for [me]:
...
Fetched 336 kB in 2s (206 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
98 packages can be upgraded. Run 'apt list --upgradable' to see them.
Tudo bem, mas em vez de executar novamente o comando anterior, como posso executar o anterior? Assim:
$ echo hi
hi
$ echo hello
hello
$ !! <-- I'm trying to get that to run 'echo hi'
hello
Basicamente, aqui está o que estou procurando
$ echo hi
hi
$ echo hello
hello
$ ??? <-- What can I put here to get it to run 'echo hi'?
echo hello!
hello!
Então, dado que !!
executa o último comando, como posso executar o comando antes do anterior? No meu exemplo, em vez de digitar !!
, o que posso executar para executar echo hi
?
Você pode usar as teclas up-arrowe down-arrowpara percorrer seu histórico de comandos. Então, para executar novamente o penúltimo comando, você pressionaria up-arrowduas vezes e, em seguida, return.
Isso tem várias vantagens sobre métodos como
!-2
. Mais importante (na minha opinião), você pode ver o comando e certificar-se de que é aquele que você pretendia executar novamente antes de pressionar o retorno para executá-lo. Mesmo além de erros simples ("oops, acho que era o terceiro comando de volta que eu queria"), o histórico do bash pode não contar os comandos anteriores da maneira que você espera por causa de opções comoignorespace
,ignoredups
e aHISTCONTROL
variável.Além disso, a recuperação interativa de comandos permite que você edite facilmente o comando antes de executá-lo novamente. Você também pode fazer isso com modificadores de recuperação de histórico, mas, novamente, fazê-lo interativamente permite que você veja suas edições antes de executar o comando recuperado/modificado.
Além disso, se você é preguiçoso como eu, up-arrow up-arrow returné mais fácil digitar do que(shift)exclamation minus 2 return
Da
HISTORY EXPANSION
seção deman bash
:Então, para executar o comando antes do último, você pode usar
!-2
Na verdade,
!!
é apenas um sinônimo de!-1
!-n
execute o comando "-n" do seu histórico, mas eu não o recomendaria, pois é "instantâneo" e não lhe dará tempo de verificar primeiro se o comando "Nth" é o correto que você precisa executar novamente.. . ( @bac0n comentou muito bem que você pode definir :shopt -s histverify
para alternar para "não instantâneo": ele permitirá que você verifique se o comando !-n expande para, antes de executá-lo com<Enter>
)No entanto, se você estiver usando
bash
como seu shell, prefiro recomendar o uso do recurso de pesquisa:Ctrl e digite
something
, que é a parte do comando que você está procurando. (ex: Ctrl+ r+ (digite no terminal)echo
)Ele apresentará a última ocorrência em seu histórico de correspondência
something
(ou seja, correspondendo ao termo de pesquisa que você digitou após Ctrl+ r).Subsequente Ctrl+ rolhará mais para trás em seu histórico. Ou adicionar letras irá precisar a pesquisa.
E quando encontrar uma boa correspondência, pressione Enterpara executá-la novamente (ou Ctrl+ cpara sair da pesquisa sem executar o comando correspondente exibido no momento).
Dica adicional: se, em vez de Enter, você pressionar Ctrl+ o, ele executará o comando de histórico selecionado E apresentará o próximo, pronto para ser executado Enter(que executa apenas aquele e retorna ao prompt normal) ou Ctrl+ onovamente (que o executa e apresente o próximo comando em seu histórico). Muito útil para repetir uma sequência de passos e fornecer uma exibição desses comandos antes de executá-los.
E cada vez que você usa essas coisas, você pode alterar algo na linha exibida no momento (usando a tecla de seta para a esquerda ou para a direita para se mover dentro dela), como um parâmetro, um nome de servidor etc., e executar essa linha modificada + vá para o próximo (se você pressionou Ctrl+ o).
Se você correr
você obterá uma lista dos últimos 'n' comandos inseridos. O tamanho do histórico é padronizado para 500 comandos. Então, como explicado pelo steeldriver, o comando antes do último pode ser executado novamente com
e sim, o penúltimo será
e assim por diante. Para mais detalhes, use
e procure por Designadores de Eventos .