Je veux faire quelque chose comme bzr commit -m "It works!"
. Je peux en quelque sorte échapper au point d'exclamation en le faisant bzr commit -m "It works\!"
. Cependant, mon message de validation inclut la barre oblique inversée. Comment puis-je échapper au point d'exclamation tout en ignorant la barre oblique inverse?
bash
syntax
escape-characters
Matthieu
la source
la source
bzr commit -m "It works"!
travaux, aussi.bzr commit -m "It works!"
Réponses:
Puisque vous ne comptez pas sur bash pour développer les variables dans votre message de validation, vous pouvez utiliser des guillemets simples. Les chaînes entre guillemets simples ne sont pas développées par bash.
la source
Voici une autre méthode si vous voulez des guillemets doubles ainsi que l'exclamation:
Cela fonctionne même si le
!
n'est pas au bout de la ligne.Par exemple:
Bonus: Une technique similaire peut être utilisée pour échapper à tout texte en Sh ou Bash (avec l'aide de sed): voir la première option de cette réponse . De plus, si vous avez
bash-completion
installé, vous avez probablement déjà laquote()
fonction disponible.la source
echo "Happy birthday!"
cela fonctionnera comme prévu, sinon vous pourrez l'échapper avec une barre oblique inversée, mais la barre oblique inverse sera également imprimée. XD Bash n'est pas pour les âmes sensibles :)echo "Happy Birthday!"
sorties 2 lignes. Le premier estecho "Happy birthday"
(pas d'exclamation) et le second est "Joyeux anniversaire" (encore une fois, pas d'exclamation). Avez-vous activé le développement de l'historique lorsque vous effectuez ce test?version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
certainement qu'un seul!
est utilisé. J'aihistexpand
présent dans$SHELLOPTS
. Cependant, je viens d'essayer la version 4.3.18 (2) sur une autre machine et elle se comporte comme vous l'avez décrit. Je suppose que c'est un bug qui a été corrigé.Désactiver l' expansion de l'historique :
ou
Vous pouvez ajouter l'une de ces commandes à votre
~/.bashrc
si vous n'utilisez généralement pas l'expansion de l'historique.Bash 4.3 a ajouté un cas particulier :
la source
set +o histexpand
, passet -o histexpand
. Pourriez-vous modifier votre réponse pour résoudre ce problème?.bashrc
merci !!, jamais utilisé!
dans les scripts et pour rien !! c'était toujours inquiétant ...echo "@AquariusPower!"
Utilisez des guillemets simples (') au lieu de guillemets doubles ("). Les guillemets simples désactivent toute interprétation des éléments qu’ils contiennent, alors que les guillemets n'en désactivent que certaines.
la source
Je viens tout juste de trouver un autre moyen, qui fonctionnera au moins avec
echo
les chaînes (phrases) que vous voulez ponctuer avec un point d’exclamation. Il effectue plus ou moins une analyse finale de Bash histexpand et ne prend qu'un peu plus de temps à coder.L'hexagone pour un point d'exclamation, comme indiqué sur http://www.ascii-code.com/ , est 21, donc si vous mettez
\x21
à la fin de votre chaîne,echo -e $foo
, faire$foo
son propre écho élargi [c. -à-foo=$(echo -e "$foo")
], ce que vous obtenez quand vousecho $foo
est à nouveau la chaîne avec un!
à la fin. Et pas de commutation histexpand non plus.Fonctionne à coup sûr dans Bash 4+. Les versions précédentes, ymmv.
la source
printf "OMG\041"
. Si vous construisez une chaîne entre guillemets qui ne soit ni echo ni printf, comme la chaîne de validation à laquelle on vous a demandé de parler, vous pouvez l'intégrer$(echo -e "\041")
à l'emplacement où devrait se trouver le point d'exclamation. Comme ceci:bzr commit -m "This is a great commit$(echo -e "\041")"
.