230 votes

En bash, comment puis-je échapper à un point d'exclamation ?

Je veux faire quelque chose comme bzr commit -m "It works!" . Je peux en quelque sorte échapper au point d'exclamation en faisant bzr commit -m "It works\!" . Cependant, alors mon message commit inclut le backslash. Comment puis-je échapper au point d'exclamation, tout en ignorant la barre oblique inverse ?

203voto

Michael Medin Points 605

Puisque vous ne dépendez pas de bash pour développer les variables dans votre message commit, vous pourriez utiliser des guillemets simples à la place. Les chaînes de caractères entre guillemets simples ne sont pas développées par bash.

bzr commit -m 'This does work!'

181voto

jwd Points 3222

Voici une autre méthode si vous voulez des guillemets doubles en plus de l'exclamation :

echo "It's broken"'!'

Cela fonctionne même si le ! n'est pas à la fin de la ligne.

Par exemple :

echo "hello there"'!'" and goodbye"

Bonus : Une technique similaire peut être utilisée pour s'échapper tout en Sh ou Bash (avec l'aide de sed) : voir la première option dans cette réponse . En outre, si vous avez bash-completion installé, vous avez probablement le site quote() fonction déjà disponibles.

82voto

Damian Powell Points 315

Éteindre expansion de l'histoire :

set +H

ou

set +o histexpand

Vous pouvez ajouter l'une de ces commandes à vos ~/.bashrc si vous n'utilisez pas habituellement l'expansion de l'histoire.

Bash 4.3 a ajouté un cas particulier :

le caractère d'expansion de l'historique est également traité comme une citation s'il précède immédiatement le guillemet fermant dans une chaîne de caractères à double guillemet.

16voto

Mike Green Points 607

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 doubles n'en désactivent qu'une partie.

bzr commit -m 'It works!'

4voto

John Nelson Points 1997

Je viens de trouver un autre moyen, qui fonctionnera au moins avec echo Les chaînes de caractères (phrases) que vous voulez ponctuer avec un point d'exclamation. Il contourne, plus ou moins, Bash histexpand et prend seulement un peu plus de temps à coder.

L'hexagone d'un point d'exclamation, tel que listé sur http://www.ascii-code.com/ est de 21, donc si vous mettez \x21 à la fin de votre chaîne, echo -e $foo , faire $foo son propre écho étendu [c'est-à-dire foo=$(echo -e "$foo") ], ce que vous obtenez lorsque vous echo $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 antérieures, ymmv.

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