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 s'il vous plaît expliquer ce que sont les "événements bash?" Je n'ai jamais entendu ce concept auparavant. Aussi, comment devrais-je sortir "!" à la fin de la phrase?
+H
pour activer quelque chose et-H
désactiver quelque chose.+
sont tout simplement le contraire.!
est un caractère spécial à bash, il est utilisé pour faire référence aux commandes précédentes; par exemple,va rappeler et exécuter la dernière commande qui a commencé avec la chaîne "rm", et
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
echo "reboot your instance!"
comme " remplacez ici la dernière commande qui a commencé par le ou les caractères suivant immédiatement le point d'exclamation ", et vous grogne de ne pas trouver un événement (commande) dans votre historique commençant par un simple double citation.Essayer
protéger (échapper) le point d'exclamation de bash.
la source
Pour résoudre votre problème initial, essayez d'utiliser des guillemets simples plutôt que des guillemets doubles. Avec ce dernier, bash tentera de développer certains caractères avant de transmettre le résultat à la commande (écho dans ce cas). Avec des guillemets simples, bash passe la chaîne entière sans aucune modification.
!
est utilisé dans les commandes pour faire référence à l'historique de ligne de commande. Voir: http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS pour un ensemble complet. Avec l'exemple ci-dessus, bash tente de se développer en!"
tant que référence à un événement avant que l'écho ne soit examiné, d'où l'erreur.Notez que dans les scripts, toutes les 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, c'est
!$
. Il se développe jusqu'au dernier argument de la commande précédente. C'est un raccourci utile dans certains endroits.la source
!!
remplir la dernière commande complète entrée est remarquablement utile; en particulier,sudo !!
oupfexec !!
$_
fonctionne dans plus de coques que bash et c'est une variable appropriée, contrairement à!$
. (et @LeartS: J'ai bien aimé le manque d'émoticônes de votre blague.;))Il suffit de mettre un espace entre! et "que ça va marcher.
À votre santé.
la source
Oui, ! est un caractère spécial à bash, il est utilisé pour faire référence aux commandes précédentes.
Peu de façons de gérer la situation
Ce qui suit va afficher la chaîne telle quelle.
Ce qui suit va exécuter la commande et concaténer la chaîne
la source
Il
bash 4.3
semble qu'il ne soit plus nécessaire d'utiliser des guillemets simples ouset +H
:la source
set +H
citer. Ou vous avezset +H
quelque part (comme dans/etc/profile
).Vous pouvez aussi utiliser un heredoc :
C'est agaçant dans ce cas parce que ce n'est pas un one-liner mais pour des commandes plus longues (comme écrire un script bash), cela fonctionne très bien.
la source