O solitário !
no início de um comando nega o status de saída do comando ou pipeline : se o comando sair em 0
, ele será alternado para 1
(falha) e, se sair de um valor diferente de zero, será transformado em uma saída 0
(com êxito).
Esse uso está documentado no manual do Bash:
If the reserved word ‘!’ precedes the pipeline, the exit status is the logical negation of the exit status as described above.
Um !
sem o seguinte comando nega o comando empty, que não faz nada e retorna true (equivalente a o comando :
). Assim, inverte o verdadeiro para um falso e sai com o status 1, mas não produz nenhum erro.
Há também outros usos de !
dentro do test
e os comandos [[
, onde negam um teste condicional. Estes não estão relacionados com o que você está vendo. Tanto na sua pergunta como nos casos, isso não está relacionado à expansão do histórico e o !
é separado de quaisquer outros termos.