195 votes

Qu'est-ce que "-bash : !" : event not found" ?

Essayez d'exécuter ce qui suit sous un Shell bash echo "Reboot your instance!"

Sur mon installation :

root@domU-12-31-39-04-11-83:/usr/local/bin# bash --version
GNU bash, version 4.1.5(1)-release (i686-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
root@domU-12-31-39-04-11-83:/usr/local/bin# uname -a
Linux domU-12-31-39-04-11-83 2.6.35-22-virtual #35-Ubuntu SMP Sat Oct 16 23:57:40 UTC 2010 i686 GNU/Linux
root@domU-12-31-39-04-11-83:/usr/local/bin# echo "Reboot your instance!"
-bash: !": event not found

Quelqu'un peut-il m'expliquer ce que sont les "événements bash" ? Je n'ai jamais entendu ce concept auparavant. De plus, comment dois-je écrire " !" à la fin de la phrase ?

165voto

MadHatter Points 77602

! est un caractère spécial à bash, il est utilisé pour se référer aux commandes précédentes ; ex,

!rm

rappellera et exécutera la dernière commande qui a commencé par la chaîne "rm", et

!rm:p

rappellera mais n'exécutera pas la dernière commande qui a commencé par la chaîne "rm". bash interprète le point d'exclamation de la commande echo "reboot your instance!" comme " remplace ici la dernière commande qui a commencé par le(s) caractère(s) suivant immédiatement le point d'exclamation "et vous reproche de ne pas trouver dans votre historique un événement (commande) commençant par un simple guillemet.

Essayez

echo reboot your instance\!

pour protéger (échapper) le point d'exclamation de bash.

124voto

jason saldo Points 5036

Vous pouvez désactiver la substitution de l'historique en utilisant set +H .

38voto

SmallClanger Points 8832

Pour résoudre votre problème initial, essayez d'utiliser des guillemets simples, plutôt que des guillemets doubles. Avec ces derniers, bash tentera de développer certains caractères avant de transmettre le résultat à la commande (echo dans ce cas). Avec les guillemets simples, bash transmet la chaîne entière, sans modification.

! est utilisé dans les commandes pour faire référence à l'historique de la ligne de commande. Voir : http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS pour un ensemble complet. Avec l'exemple ci-dessus, bash essaie d'étendre !" comme une référence à un événement avant que l'écho n'obtienne un regard, d'où l'erreur.

Notez que dans scripts, tous des commandes d'historique sont désactivées, car elles n'ont de sens que dans un Shell interactif.

Le seul que j'utilise régulièrement est le suivant !$ . Elle s'étend au dernier argument de la commande précédente. C'est un raccourci utile dans certains cas.

10voto

Isik Mater Points 119

Il suffit de mettre un espace entre ! y " que ça va marcher.

7voto

Syed Qaiser Points 71

Oui, ! est un caractère spécial à bash, il est utilisé pour se référer aux commandes précédentes.

Voici quelques façons de gérer la situation

Ce qui suit produira la chaîne de caractères telle qu'elle est

echo 'Reboot your instance!'

Ce qui suit exécutera la commande et concaténera la chaîne de caractères

echo 'escaping #'" adding `which python` to the string"
echo '#!'`which python`

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X