O que a digitação de um único ponto de exclamação faz no Bash?

18

O Bash usa pontos de exclamação para expansões de histórico, conforme explicado nas respostas a esta pergunta (por exemplo, sudo !! executa a linha de comandos anterior com sudo ). No entanto, não consigo encontrar em qualquer lugar que explica 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. Eu olhei online e na página man Bash, mas não consigo encontrar nada, além do fato de que é uma "palavra reservada" - mas também é } , e rodando isso:

}

imprime um erro:

bash: syntax error near unexpected token '}'
    
por Josh 14.04.2018 / 22:57

5 respostas

44

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.

    
por 15.04.2018 / 00:21
10

Você pode encontrar o único ponto de exclamação documentado na seção manual do 3.2.2 Pipelines a>

If the reserved word ‘!’ precedes the pipeline, the exit status is the logical negation of the exit status as described above.

$ ! true; echo $?
1
$ ! false; echo $?
0

Também seção 3.2.4.2 Construções Condicionais

! expression

True if expression is false.

Também seção 4.1 Bourne Shell Builtins

! expr

True if expr is false.

Também deve ser notado que ! iniciará a substituição do histórico a menos que seja seguido por: um espaço, tab, o final da linha, '=' ou '(' (quando a opção shell extglob é ativada usando o shopt builtin) ).

    
por 14.04.2018 / 23:04
0

Porque ! é usado em comparações e significa NÃO .

Por exemplo:

a=3
b=2

[ $a -eq $b ] && echo "Equal"
[ ! $a -eq $b ] && echo "Not equal"
# of cause last comparison is possible to write as:
[ $a -eq $b ] || echo "Not equal"

[ $a -eq $b ]
echo $?
1
[ ! $a -eq $b ]
echo $?
0
    
por 14.04.2018 / 23:05
-2
O comando interno

! , inverte o sentido de um pipeline.

Outros usos:

O comando interno

#! , chama o intérprete nomeado para executar o script.

! event designator, marca uma palavra de linha de comando como uma substituição de histórico

!= operador de desigualdade

A variável

$! shell, retorna o número do processo do último comando de segundo plano.

    
por 15.04.2018 / 02:04
-3

seguido por uma string executa o comando anterior mais recente (ainda no buffer de comando) que iniciou com a string dada. Talvez o shell tenha acabado de descobrir que o no comando anterior começou com < null & gt ;.

    
por 15.04.2018 / 01:17