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 executar o seguinte comando (ou seja, um único ponto de exclamação):
!
Parece não imprimir nada e sair com 1, mas não sei por que isso acontece. Procurei on-line e na página de manual do Bash, mas não consigo encontrar nada, além do fato de ser uma "palavra reservada" - mas é o que ocorre }
e executando o seguinte:
}
imprime um erro:
bash: syntax error near unexpected token `}'
!
indica o "início" de uma expressão de expansão do histórico.Respostas:
O único
!
no início de um comando nega o status de saída do comando ou pipeline : se o comando sair0
, ele entrará em1
(falha) e, se sair diferente de zero, o transformará em uma0
saída (bem-sucedida).Esse uso está documentado no manual do Bash:
Um
!
sem seguinte comando nega o comando vazio, que não faz nada e retorna verdadeiros (equivalentes para o:
comando ). Assim, inverte o verdadeiro para falso e sai com o status 1, mas não produz nenhum erro.Também existem outros usos
!
dentro dos comandostest
e[[
, nos quais eles negam um teste condicional. Eles não têm relação com o que você está vendo. Na sua pergunta e nesses casos, não está relacionado à expansão do histórico e!
é separado de outros termos.fonte
Você pode encontrar o ponto de exclamação único documentado na seção 3.2.2.
Seção 3.2.4.2 - Construções Condicionais
Também seção 4.1 Bourne Shell Builtins
Também deve-se observar que
!
iniciará a substituição do histórico, a menos que seja seguido por: um espaço, tabulação, final da linha, '=' ou '(' (quando a opção extglob shell estiver ativada usando o shopt interno).fonte
Porque
!
é usado em comparações e significa NÃO .Por exemplo:
fonte
!
um argumento para otest
comando (incluindo a versão interna do bash), não o significado de!
quando usado na posição do comando.! [...]
corresponder à pergunta neste caso.[]
simtest
. Estou um pouco apressado.!
comando interno, inverte o sentido de um pipeline.Outros usos:
#!
comando interno, chama o intérprete nomeado para executar o script.!
designador de evento, marca uma palavra da linha de comandos como uma substituição do histórico!=
operador de desigualdade$!
variável shell, retorna o número do processo do último comando em segundo plano.fonte
ls -l /tmp
cd !$
Isso o levará ao diretório / tmp.! seguido por uma sequência executa o comando anterior mais recente (ainda no buffer de comando) iniciado com a sequência especificada. Talvez o shell tenha descoberto que nenhum comando anterior começou com <null>.
fonte