Veuillez regarder ces commandes:
$ notify-send SYNC TIME!
$ notify-send 'SYNC TIME!'
$ notify-send "SYNC TIME!"
bash: !": event not found
$
Les deux premières commandes produisent une bulle de notification comme prévu. Le troisième donne l'erreur indiquée.
et
$ echo SYNC TIME!
SYNC TIME!
$ echo 'SYNC TIME!'
SYNC TIME!
$ echo "SYNC TIME!"
bash: !": event not found
$
Ici aussi, les echo
travaux pour les deux premières commandes mais pas dans la troisième.
Plus de problèmes ici (même si je n'avais pas l'intention de l'utiliser): les deux notify-send "SYNC!TIME"
et echo "SYNC!TIME"
donner bash: !TIME": event not found
.
Mais à la fois notify-send
et echo
travailler avec"SYNC! TIME"
Quelqu'un peut-il expliquer pourquoi l' bash: !": event not found
erreur apparaît?
.bashrc
ligneset +H
. Notez que ce!
n'est déjà pas spécial dans les scripts; le traiter comme spécial romprait de nombreux scripts conformes aux normes. Il n'est traité que comme "spécial" dans les shells interactifs, et uniquement par défaut jusqu'à ce que vous le corrigiez. :-)Parce que dans bash,
!
est un mot réservé (OK, caractère), il a une signification particulière dans différents contextes. Dans ce cas particulier, vous ne respectez pas son importance dans la recherche d'histoire. Deman bash
:Fondamentalement, cela signifie que bash prendra les caractères après le
!
et recherchera dans votre historique la première commande qu'il trouve qui commence par ces caractères. Il est plus facile de démontrer que d'expliquer:L'
!
expansion de l'historique activée, qui correspondait à la première commande commençant par cellee
qui était exécutée précédemmentecho foo
puis exécutée à nouveau. Donc, lorsque vous avez écrit"SYNC TIME!"
, bash a vu!"
, recherché dans l'historique une commande commençant par"
, a échoué et s'en est plaint. Vous pouvez obtenir la même erreur en exécutant, par exemple!nocommandstartswiththis
.Pour imprimer un point d'exclamation, vous devez l'échapper de l'une des deux manières suivantes:
la source
echo Hello world!
fonctionne --- l'expansion de l'histoire n'est pas déclenchée par des blancs ;-) (ah, les belles caisses de coin ...)!
est un mot réservé dansbash
, comme Posix déclare également . Mais je suis à peu près sûr que son statut est totalement indépendant de son rôle dans l'expansion de l'histoire et non pertinent pour son traitement entre guillemets.!
est un mot réservé car il annule l'état de sortie d'une commande / pipeline, il ne peut donc pas être utilisé comme commande. Aucun autre mot réservé n'est spécial dans un"
contexte entre guillemets, alors qu'il$
n'est pas un mot réservé mais est traité spécialement.