J'essaie d'utiliser la commande curl pour accéder à une URL http avec un point d'exclamation ( !
) dans son chemin. par exemple:
curl -v "http://example.org/!287s87asdjh2/somepath/someresource"
la console répond avec bash: ... event not found
.
Qu'est-ce qui se passe ici? et quelle serait la syntaxe appropriée pour échapper au point d'exclamation?
bash
quoting
special-characters
netbrain
la source
la source
Réponses:
Le point d'exclamation fait partie de l'expansion de l'historique dans bash. Pour l'utiliser, vous devez le mettre entre guillemets simples (par exemple:)
'http://example.org/!132'
ou l'échapper directement avec une barre oblique inverse (\
) avant le caractère (par exemple:)"http://example.org/\!132"
.Notez que, entre guillemets, une barre oblique inverse avant le point exclut empêche l’extension de l’historique, MAIS la barre oblique inverse n’est pas supprimée dans un tel cas. Il est donc préférable d’utiliser des guillemets simples afin de ne pas transmettre une barre oblique inverse littérale à
curl
l’URL.la source
"http://example.org/\!132"
s’agrandit sans interpréter la barre oblique inversée (pour des raisons de conformité POSIX, je crois).\!
et de guillemets doubles.|
et est utilisé pour créer un tuyau. Si vous envoyez des scripts aux clients et que vous ne savez pas dans quel shell ils vont l'exécuter, vous devez tous les tester!En plus de la réponse donnée par Daniel, vous pouvez également simplement désactiver l'extension de l'historique si vous ne l'utilisez pas
set +H
.la source
Ctrl-R
) qui vous permettent de prévisualiser et d'éditer votre commande afin que vous ne tiriez pas à l'aveuglette avec une commande!-14
que vous aviez à faire!-12
, oups, se trouvait êtrerm -rf *
. Fais attention. Désactiver l'expansion de l'historique! Esquive le!
!fc -14
. Mais il est vrai que vous pouvez le faire sans que l'extension de l'historique ne soit également activée. Personnellement, j'utilise!$
et!vi
etsudo !!
et mêmegit add !vi:$
assez souvent pour justifier de laisser l'expansion de l'historique activée.Personnellement, je ferais des guillemets simples, mais par souci d'exhaustivité, je noterai aussi qu'il s'agit d'une URL, vous pouvez coder le
!
comme%21
, par exemplecurl -v http://example.org/%21132
.la source
Cela peut aussi faire
curl -v "http://example.org/"'!'"287s87asdjh2/somepath/someresource"
ou
curl -v "http://example.org/"\!"287s87asdjh2/somepath/someresource"
Ce qui fonctionne car bash concatène les chaînes adjacentes. Cette approche est particulièrement utile lorsque d'autres éléments nécessitent une expansion du shell. Vous ne pouvez donc pas utiliser de guillemets simples pour toute la chaîne:
curl -v 'http://example.org/!'"287s87asdjh2/${basepath}/someresource"
!
Le caractère est utilisé pour les développements de l'historique dans l'invite de ligne de commande.cela peut donc poser un problème dans prompt mais pas dans les fichiers de script shell.
comme vous pouvez le voir, les extensions d’historique fonctionnent même entre guillemets doubles.
la source
J'ai rencontré le même problème et ma solution simple consistait à utiliser une variable:
Ici, la simplicité est que (1) Il est portable entre les commandes et les commandes (2) Ne nécessite pas de connaître la syntaxe d'échappement et les codes ASCII.
la source
Depuis Bash 4.3, vous pouvez maintenant utiliser des guillemets doubles pour citer le caractère d'expansion de l'historique:
la source
echo
, écho semble traiter cela différemmentbash
version n'a rien à voir avec le bang non développé, c'est dû au fait que dans votre exemple, le!
mot "fin de ligne" est suivi et que cela empêche le shell d'essayer de le développer. Essayezecho "!Hello World"
et vous verrez quibash
répondra avecbash: !Hello: event not found
. Voir le manuel pour plus de détailsPour ceux qui utilisent git bash dans Windows, la réponse acceptée de @DanielPittman fonctionne. Cependant, vous devez remplacer la barre oblique inverse (\) par une barre oblique (/).
Par exemple, sous Unix, cela ressemblerait à ceci:
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS\!ZR412543s'
Pour Windows, ce serait quelque chose comme ceci (concentrez-vous sur la barre oblique dans la partie en-tête d'autorisation)
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS/!ZR412543s'
la source