O caractere !
é chamado de "bang" e bash
o utiliza para recuperar o histórico de comandos. Você pode usá-lo de quatro maneiras:
!<firstFewCharsOfPreviousCommand>
exemplo:
!rm
Isso irá para o último comando que você executou que começou com "rm" e executará a coisa toda. Seja cuidadoso ao repetir comandos potencialmente destrutivos como o rm, já que você pode, sem intenção, executar outro que você pensou que faria. Acima é somente uma ilustração, usando a função de busca reversa CTRL-R
do bash é uma alternativa muito mais segura.
!<indexInCommandHistory>
exemplo:
!433
O índice é o número que aparece ao lado do comando quando você executa o comando history
.
!!
Não é necessário nenhum exemplo, pois isso é tudo. Ele re-executa o comando imediatamente anterior (o mesmo que seta para cima na maioria das distribuições Linux).
!$
Exemplo:
# ls -lh /etc/fstab
# vi !$
Outro literal, quando o bash executa isso, o !$
é substituído pela última palavra (string de caracteres sem espaço em branco)
Como você pode ver com o último, você pode até usá-lo como parte de um comando maior ou diferente. Outro exemplo disso com !!
:
[root@hypervisor libsceptre]# echo hey
hey
[root@hypervisor libsceptre]# echo !!
echo echo hey <-- printed to stderr so you know what !! was expanded to
echo hey
[root@hypervisor libsceptre]#
Se você quiser que o bash, por alguma razão, visualize o caractere como um literal e não tente interpretá-lo, coloque o texto entre aspas simples:
[root@hypervisor libsceptre]# echo -e "Hello\nWorld!"
-bash: !": event not found
[root@hypervisor libsceptre]# echo -e 'Hello\nWorld!'
Hello
World!
[root@hypervisor libsceptre]#
A razão pela qual seu comando não está funcionando é porque ele está tentando encontrar o último comando que você escreveu que começou com uma aspa dupla (a funcionalidade descrita no meu primeiro exemplo) e não consegue encontrá-lo.