O Bash usa pontos de exclamação para expansões do histórico, conforme explicado nas respostas a esta pergunta (por exemplo sudo !!
, executa a linha de comando anterior com sudo
). No entanto, não consigo encontrar nenhum lugar que explique o que a execução do seguinte comando (ou seja, um único ponto de exclamação) faz:
!
Parece não imprimir nada e sair com 1, mas não sei por que isso acontece. Procurei online e na página de manual do Bash, mas não consigo encontrar nada, além do fato de ser uma "palavra reservada" - mas também é }
, e executando isto:
}
imprime um erro:
bash: syntax error near unexpected token `}'
O solitário
!
no início de um comando nega o status de saída do comando ou pipeline : se o comando sair0
, ele se transformará em1
(falha) e, se sair diferente de zero, o transformará em uma0
saída (bem-sucedida).Este uso está documentado no manual do Bash:
A
!
sem o seguinte comando nega o comando vazio, que não faz nada e retorna verdadeiro (equivalente ao comando:
) . Assim, ele inverte o verdadeiro para o falso e sai com o status 1, mas não produz nenhum erro.Há também outros usos
!
dentro dos comandostest
e , onde eles negam um teste condicional.[[
Estes não estão relacionados com o que você está vendo. Tanto na sua pergunta quanto nesses casos, ela não está relacionada à expansão do histórico e!
está separada de quaisquer outros termos.Você pode encontrar o único ponto de exclamação documentado na seção manual do bash 3.2.2 Pipelines
Também a seção 3.2.4.2 Construções condicionais
Também seção 4.1 Bourne Shell Builtins
Também deve ser observado que
!
iniciará a substituição do histórico, a menos que seja seguido por: um espaço, tabulação, o final da linha, '=' ou '(' (quando a opção extglob shell estiver habilitada usando o shopt embutido).Porque
!
é usado em comparações e significa NÃO .Por exemplo:
!
comando embutido, inverte o sentido de um pipeline.Outros usos:
#!
comando interno, chama o interpretador nomeado para executar o script.!
designador de evento, marca uma palavra de linha de comando como uma substituição de histórico!=
operador de desigualdade$!
variável shell, retorna o número do processo do último comando em segundo plano.! seguido por uma string executa o comando anterior mais recente (ainda no buffer de comando) que começou com a string fornecida. Talvez o shell tenha descoberto que nenhum comando anterior começou com <null>.