eu usei
history | less
para obter as linhas dos comandos anteriores e, a partir dos números do lado esquerdo, encontrei a linha que queria repetir (por exemplo, 22) e fiz
!22
no prompt de comando e funcionou - executando o conjunto de comandos na linha que fiz naquele momento. Não consigo descobrir onde o ponto de exclamação é usado, o que ele representa em termos de ações executadas pelo bash e onde usá-lo. Na documentação, não vejo uma explicação que seja 'tangível'.
Respostas:
!
é um recurso que apareceu originalmente no shell C , antigamente, antes que você pudesse contar com terminais para ter teclas de seta. É especialmente útil se você adicionar o número do comando atual ao prompt (PS1="\!$ "
) para poder olhar rapidamente para a tela para obter números dos comandos anteriores.Agora que você pode usar as teclas de seta e coisas como Ctrl-Rpesquisar no histórico de comandos, não vejo muita utilidade para o recurso.
Uma variante dele que você ainda pode achar útil é
!!
, que reexecuta o comando anterior. Por si só, não encontro !!Enternada mais rápido do que apenas ↑ Enter, mas pode ser útil quando combinado em um comando maior.Exemplo: Um erro piloto comum em
sudo
sistemas baseados é esquecer osudo
prefixo em um comando que requer privilégios extras. Um iniciante redigita o comando inteiro. O aluno diligente edita o comando a partir do histórico de comandos do shell. O iluminado digitasudo !!
.O Bash permite desativar o
!
processamento no shell comset +o histexpand
ouset +H
. Você pode desativá-lo no Zsh comset -K
.fonte
sudo
ou algo assim), pode fazê-losudo !!
, por exemplo. Isso pode ser um pouco mais rápido que "Up / Ctrl-A (ou Home, se você tiver sorte o suficiente) / sudo / space / enter". YMMV. :)echo 'Hi!'
ouecho "Hi!"
ouecho Hi\!
. Todos fazem a mesma coisa.setopt NO_BANG_HIST
no zsh pode ser mais memorável que-K
.Se não houver uma resposta mais longa aqui, certamente haverá uma no Superusuário, já que li uma recentemente. Na página de manual do bash, você pode encontrar uma seção enorme intitulada EXPANSÃO DE HISTÓRIA sobre o assunto.
Você pode executar um host inteiro mais do que apenas executar o último comando ou o número de comando X. Você pode
!cat
executar ações como executar o último comando iniciado comcat
. Ou!?bash?:s/bash/csh/
executa o último comando que contém,bash
mas o substitui porcsh
.fonte
!!:s/bash/csh/
realmente executa o último comando e substitui o bash pelo csh, se presente. Não é o último comando que incluiu o bash. Isso seria!?bash?:s/bash/csh/
ou talvez!?bash?:s/%/csh/
man
páginas, esse recurso é incrivelmente obscuro. Obrigado por apontar a seção relevante - esse é o único lugar nos documentos reais em que eles explicam suficientemente.Muito mais pode ser feito com
!
:!-3
!ls
e muito mais. Veja 15 exemplos de expansão do histórico de Linux Bash que você deve conhecer
fonte
Um amigo meu me enviou este e-mail:
fonte
Claro que você pode fazer
!!
para reutilizar o último comando no shell bash. E depois há!$
para reutilizar a última parte do seu último comando.por exemplo, veja algum arquivo
Se agora você deseja editar o mesmo arquivo, pode
!$
obter apenas o caminho do último comandofonte
$touch f1 f2
e depois$vim !$
avaliará$vim f2