Bash utilise des points d'exclamation pour les extensions d'historique, comme expliqué dans les réponses à cette question (par exemple, sudo !!
exécute la ligne de commande précédente avec sudo
). Cependant, je ne trouve nulle part qui explique ce que fait l'exécution de la commande suivante (c'est-à-dire un seul point d'exclamation):
!
Il semble ne rien imprimer et sortir avec 1, mais je ne sais pas pourquoi il fait cela. J'ai regardé en ligne et dans la page de manuel de Bash, mais je ne trouve rien, à part le fait que c'est un "mot réservé" - mais c'est le cas }
, et en exécutant ceci:
}
imprime une erreur:
bash: syntax error near unexpected token `}'
!
indique le "début" d'une expression d'extension d'historique.Réponses:
Le seul
!
au début d'une commande annule l'état de sortie de la commande ou du pipeline : si la commande se termine0
, elle basculera en1
(échec), et si elle sort non nulle, elle le transformera en une0
sortie (réussie).Cette utilisation est documentée dans le manuel Bash:
Un
!
sans commande suivante annule la commande vide, qui ne fait rien et retourne vrai (équivalent à la:
commande ). Il inverse ainsi le vrai en faux et quitte avec le statut 1, mais ne produit aucune erreur.Il existe également d'autres utilisations de
!
dans les commandestest
et[[
, où elles annulent un test conditionnel. Ceux-ci ne sont pas liés à ce que vous voyez. Dans votre question et dans ces cas, cela n'est pas lié à l'expansion de l'histoire et!
est séparé de tout autre terme.la source
Vous pouvez trouver le point d'exclamation unique documenté dans la section 3.2.2 Pipelines du manuel bash
Section 3.2.4.2 Constructions conditionnelles également
Section 4.1 Bourne Shell Builtins
Il convient également de noter que la
!
substitution d'historique démarrera à moins d'être suivie par: un espace, une tabulation, la fin de la ligne, '=' ou '(' (lorsque l'option shell extglob est activée à l'aide de la fonction intégrée shopt).la source
Parce que
!
est utilisé dans les comparaisons et signifie NON .Par exemple:
la source
!
comme argument de latest
commande (y compris la version intégrée de bash), et non la signification de!
lorsqu'il est utilisé en position de commande.! [...]
à la question dans ce cas.[]
c'esttest
. Je suis un peu pressé.!
commande intégrée, inverse le sens d'un pipeline.Autres utilisations:
#!
commande intégrée, appelle l'interpréteur nommé pour exécuter le script.!
désignateur d'événement, marque un mot de ligne de commande comme substitution d'historique!=
opérateur d'inégalité$!
variable shell, retourne le numéro de processus de la dernière commande en arrière-plan.la source
ls -l /tmp
cd !$
Cela vous amènera au répertoire / tmp.! suivi d'une chaîne exécute la commande précédente la plus récente (toujours dans le tampon de commande) qui a commencé avec la chaîne donnée. Peut-être que le shell vient de découvrir qu'aucune commande précédente n'a commencé par <null>.
la source