it-swarm-eu.dev

Nelze v vykřičníku použít vykřičník (!)?

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?

103
netbrain

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.

111
Daniel Pittman

Stejně jako odpověď Daniela, můžete také jednoduše vypnout rozšíření historie, pokud ji nepoužíváte s set +H.

68
Chris Down

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.

18

To také může udělat

curl -v "http://example.org/"'!'"287s87asdjh2/somepath/someresource"
nebo
curl -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.

13
mug896

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).

9
Prem

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!
3
Flimm

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'

0
SamuelDev