Ich versuche, mit dem Befehl curl auf eine http-URL mit einem Ausrufezeichen ( !
) im Pfad zuzugreifen . z.B:
curl -v "http://example.org/!287s87asdjh2/somepath/someresource"
Die Konsole antwortet mit bash: ... event not found
.
Was geht hier vor sich? und was wäre die richtige Syntax, um dem Ausrufezeichen zu entgehen?
bash
quoting
special-characters
netbrain
quelle
quelle
Antworten:
Das Ausrufezeichen ist Teil der Verlaufserweiterung in Bash. Um es zu benutzen, müssen Sie es in einfache Anführungszeichen setzen (zB:)
'http://example.org/!132'
oder es direkt mit einem Backslash (\
) vor dem Zeichen (zB:) schließen"http://example.org/\!132"
.Beachten Sie, dass in doppelten Anführungszeichen ein Backslash vor dem Exklam die Verlaufserweiterung verhindert, der Backslash jedoch in einem solchen Fall nicht entfernt wird. Es ist daher besser, einfache Anführungszeichen zu verwenden, damit Sie keinen wörtlichen Backslash
curl
als Teil der URL übergeben.quelle
"http://example.org/\!132"
Erweitert sich tatsächlich, ohne den Backslash zu interpretieren (aus Gründen der POSIX-Konformität, glaube ich).\!
und doppelte Anführungszeichen.|
und wird zum Erstellen einer Pipe verwendet. Wenn Sie Skripte an Kunden senden und nicht sicher sind, in welcher Shell sie sie ausführen, müssen Sie sie alle testen!Neben der Antwort von Daniel können Sie die Verlaufserweiterung auch ganz einfach deaktivieren, wenn Sie sie nicht verwenden
set +H
.quelle
Ctrl-R
), mit denen Sie Ihren Befehl in der Vorschau anzeigen und bearbeiten können, damit Sie nicht blindlings mit dem Befehl abfeuern!-14
, den Sie!-12
gerade ausgeführt habenrm -rf *
. Sicher sein. Verlaufserweiterung deaktivieren! Eschew the!
!fc -14
. Aber es ist wahr, dass Sie dies tun können, ohne dass die Verlaufserweiterung ebenfalls aktiviert ist. Persönlich verwende ich!$
und!vi
undsudo !!
und sogargit add !vi:$
oft genug, um zu gewährleisten, dass die Historienerweiterung aktiviert bleibt.Ich persönlich würde tun einfache Anführungszeichen, aber der Vollständigkeit halber werde ich auch zur Kenntnis , da es sich um eine URL ist, können Sie die kodieren , können
!
wie%21
zBcurl -v http://example.org/%21132
.quelle
Das kann man auch
curl -v "http://example.org/"'!'"287s87asdjh2/somepath/someresource"
oder
curl -v "http://example.org/"\!"287s87asdjh2/somepath/someresource"
Das funktioniert, weil Bash benachbarte Zeichenfolgen verkettet. Dieser Ansatz ist besonders nützlich, wenn Sie andere Dinge haben, die eine Shell-Erweiterung erfordern, sodass Sie keine einfachen Anführungszeichen für die gesamte Zeichenfolge verwenden können:
curl -v 'http://example.org/!'"287s87asdjh2/${basepath}/someresource"
!
Das Zeichen wird für Verlaufserweiterungen in der Befehlszeile verwendet.Daher kann dies ein Problem in Eingabeaufforderungen, jedoch nicht in Shell-Skriptdateien sein.
Wie Sie sehen können, funktionieren Verlaufserweiterungen sogar in doppelten Anführungszeichen.
quelle
Ich bin auf dasselbe Problem gestoßen, und meine einfache Lösung bestand darin, eine Variable zu verwenden:
Hier ist die Einfachheit, dass (1) Es ist portabel über Shells und Befehle (2) Erfordert keine Kenntnisse der Escape-Syntax und ASCII-Codes.
quelle
Seit Bash 4.3 können Sie doppelte Anführungszeichen verwenden, um das Verlaufserweiterungszeichen zu zitieren:
quelle
echo
, Echo scheint dies anders zu behandelnbash
Version hat nichts damit zu tun, dass der Knall nicht erweitert wird. Dies liegt daran, dass in Ihrem Beispiel!
hinter dem "Zeilenende" ein "Zeilenende" steht und die Shell nicht versucht, ihn zu erweitern. Versuchenecho "!Hello World"
Sie es und Sie werden sehen, dass Siebash
mit antwortenbash: !Hello: event not found
. Siehe Handbuch für weitere DetailsFür diejenigen, die git bash in Windows verwenden, funktioniert die akzeptierte Antwort von @DanielPittman. Sie sollten jedoch den umgekehrten Schrägstrich (\) durch einen Schrägstrich (/) ersetzen.
In Unix sieht es beispielsweise so aus:
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS\!ZR412543s'
Für Windows wäre es ungefähr so (Fokus auf den Schrägstrich im Autorisierungsheader)
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS/!ZR412543s'
quelle