O designador do evento histórico !!
é substituído pelo último comando em sua história. Bash primeiro imprime o comando como ele será executado e, em seguida, o executa.
Exemplo:
$ foo
foo: command not found
$ !!
foo # command to be executed
foo: command not found # result of execution
No seu caso:
$ echo !
!
$ echo !!
echo echo ! # command to be executed
echo ! # result of execution
$ echo !!!
echo echo echo !! # command to be executed
echo echo !! # result of execution
Observe que um comando com um designador de evento não é inserido no histórico conforme digitado. Primeiro, o designador do evento é expandido e, em seguida, o comando é inserido no histórico. É por isso que no terceiro comando ( echo !!!
), o designador do evento não é substituído por echo !!
(o segundo comando digitado), mas por echo echo !
(o segundo comando expandido).
Aqui está o último comando novamente com a parte substituída em destaque:
$ echo (!!)!
echo (echo echo !)! # command to be executed
echo echo !! # result of execution