Pokouším se použít příkaz curl pro přístup k http URL s vykřičníkem (!
) ve své cestě. např:
curl -v "http://example.org/!287s87asdjh2/somepath/someresource"
konzole odpoví pomocí bash: ... event not found
.
Co se to tu děje? a jaká by byla správná syntaxe k úniku z vykřičníku?
Vykřičník je součástí historie rozšíření v bash. Abyste ji mohli používat, musíte ji uzavřít do jednoduchých uvozovek (např .: 'http://example.org/!132'
) nebo přímo uniknout zpětným lomítkem (\
) před znakem (např .: "http://example.org/\!132"
).
Všimněte si, že ve dvojitých uvozovkách zpětné lomítko před výkřikem brání rozšíření historie, ale v takovém případě není zpětné lomítko odstraněno. Je proto lepší použít jednoduché uvozovky, takže v rámci adresy URL nepředáváte doslovné zpětné lomítko k curl
.
Stejně jako odpověď Daniela, můžete také jednoduše vypnout rozšíření historie, pokud ji nepoužíváte s set +H
.
Osobně bych udělal jednoduché uvozovky, ale pro úplnost si také všimnu, protože se jedná o URL, můžete kódovat !
tak jako %21
, např. curl -v http://example.org/%21132
.
To také může udělat
curl -v "http://example.org/"'!'"287s87asdjh2/somepath/someresource"
nebocurl -v "http://example.org/"\!"287s87asdjh2/somepath/someresource"
Což funguje, protože bash zřetězuje sousední řetězce. Tento přístup je zvláště užitečný, když máte další věci, které vyžadují rozšíření Shell, takže pro celý řetězec nemůžete použít jednoduché uvozovky:
curl -v 'http://example.org/!'"287s87asdjh2/${basepath}/someresource"
!
znak se používá pro rozšíření historie v příkazovém řádku Prompt.
, takže to může být problém v Prompt, ale ne v souborech skriptu Shell.
Jak vidíte, rozšíření historie fungují i ve dvojitých uvozovkách.
Narazil jsem na stejný problém a mým jednoduchým řešením bylo použít proměnnou:
E=!
curl -v "http://example.org/${E}287s87asdjh2/somepath/someresource"
Zde je jednoduchost taková, že (1) Je přenosný přes shelly a příkazy (2) Nevyžaduje znalost syntaxe escape a kódů ASCII).
Od Bash 4.3 můžete nyní použít dvojité uvozovky k citaci znaku rozšíření historie:
$ bash --version
GNU bash, version 4.3...
[...]
$ echo "Hello World!"
Hello World!
Pro ty, kteří používají git bash v systému Windows, přijímaná odpověď z @ Danielielitman pracuje. Měli byste však nahradit zpětné lomítko (\) lomítkem (/).
Například v unixu by to vypadalo takto:
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS\!ZR412543s'
U oken by to mělo být něco podobného (zaměření na lomítko v části záhlaví autorizace)
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS/!ZR412543s'