Wie entkomme ich in Bash einem Ausrufezeichen?

85943
Matthew

Ich möchte sowas machen bzr commit -m "It works!". Ich kann sozusagen dem Ausrufezeichen entkommen bzr commit -m "It works\!". Dann enthält meine Commit-Nachricht jedoch den Backslash. Wie entkomme ich dem Ausrufezeichen, während der umgekehrte Schrägstrich noch ignoriert wird?

169
`Bzr commit -m machen 'es funktioniert'!` Funktioniert aber auch. kba vor 10 Jahren 1
Wie gesagt, bevor der Befehl, den Sie setzen, tatsächlich von selbst funktioniert :) `bzr commit -m" It works! "` h4unt3r vor 9 Jahren 1
Ein noch eigenartigerer Fall mit geschachtelten Anführungszeichen: http://stackoverflow.com/questions/22125658/how-to-escape-history-expansion-exclamation-mark-inside-adouble-quoted-comm Ciro Santilli 新疆改造中心 六四事件 法轮功 vor 8 Jahren 0
Die akzeptierte Antwort ist zwar eine gute Lösung für Ihre Commit-Probleme, aber ich denke, es ist keine Antwort auf das eigentliche Problem: [Bash History-Erweiterung] (https://www.gnu.org/software/bash/manual/bashref.html#) Geschichte-Interaktion). Erwägen Sie, Dennis 'Antwort zu akzeptieren? Arjan vor 8 Jahren 0

5 Antworten auf die Frage

141
Benjamin Bannier

Da Sie nicht auf bash angewiesen sind, um Variablen in Ihrer Commit-Nachricht zu erweitern, können Sie stattdessen einfache Anführungszeichen verwenden. Strings in einfachen Anführungszeichen werden nicht durch Bash erweitert.

bzr commit -m 'This does work!' 
Da stand die Frage "Wie entkomme ich einem Ausrufezeichen?" und nicht "Wie kann ich ein Ausrufezeichen nicht erweitern?" Ich glaube nicht, dass das gültig ist. Es gibt einige Situationen (wenn Sie Apostrophe und Ausrufezeichen in derselben Befehlszeile übergeben), dass dies nicht funktioniert. Die Antwort unten funktioniert viel besser, was viele Menschen brauchen. Jann vor 12 Jahren 23
@Jann: Du hast zu 100% Recht, aber ich denke, das Problem ist hier mit so vielen Fragen zu Superuser: Beantworten wir die Frage auf den Punkt oder helfen wir den Leuten, ihr spezifisches Problem zu lösen. Ich denke, beide Möglichkeiten können nützlich sein, und dies war die Suche nach Hilfe zu einem bestimmten Problem. Benjamin Bannier vor 12 Jahren 7
touché! Dies war ein spezifisches Problem. Ich möchte nur eine Antwort auf meine Fragen haben, um in vielen Situationen eingesetzt zu werden. pS: Der Grund, warum ich das überhaupt erwähnte, war, dass ich sowohl ein Apostroph als auch ein Ausrufezeichen an ein Perl-Programm übergeben musste, und ich brauchte die folgende Lösung. :) Jann vor 12 Jahren 0
Ich stimme sowohl mit Benjamin als auch mit Jann überein, gab aber einen Abstieg ab. Der Titel der Frage wird von Suchmaschinen indiziert und so bin ich hierher gekommen und wahrscheinlich kommen die meisten Benutzer hierher. Deshalb glaube ich, dass es wichtig ist, dass die eigentliche Frage das Problem reflektiert, das dahinter steht. In anderen Foren wird empfohlen (fast gezwungen), genau zu fragen, wonach sie suchen. Die Beantwortung schlecht geäußerter Fragen unterstützt Schlamperei und das ist der genaue Grund für meine Ablehnung. Als Kompromiss / Lösung empfehle ich, die Überschrift so anzupassen, dass sie das tatsächliche Problem widerspiegelt. ChristophK vor 6 Jahren 0
141
jwd

Alte Frage, die ich kenne, aber für zukünftige Suchende:

Sie können diese Methode auch verwenden, wenn Sie doppelte Anführungszeichen sowie den Ausruf verwenden möchten:

echo "It's broken"'!' 

Das funktioniert auch, wenn das !nicht am Ende der Zeile steht.

Zum Beispiel:

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

Bonus: Eine ähnliche Technik kann verwendet werden, um jeden Text in Sh oder Bash (mit Hilfe von sed) zu schützen: Siehe die erste Option in dieser Antwort . Wenn Sie bash-completioninstalliert haben, steht Ihnen die quote()Funktion wahrscheinlich bereits zur Verfügung.

Netter Tipp, JWD. Ich wusste nicht, dass Bash-Strings einfach verkettet werden können, indem Leerzeichen zwischen ihnen weggelassen werden. Alan H. vor 12 Jahren 4
Wenn das Ausrufezeichen am Ende der Zeichenfolge steht, werden Sie im klaren "Echo Happy Birthday!" Wie erwartet funktionieren, ansonsten können Sie es mit einem Backslash umgehen, der Backslash wird jedoch ebenso gedruckt wie XD Bash nicht für schwache Nerven :) h4unt3r vor 9 Jahren 0
@ h4unt3r: Merkwürdig, das ist nicht meine Erfahrung. "Echo Happy Birthday!" Gibt für mich 2 Zeilen aus. Der erste ist "Echo" Happy Birthday "" (kein Ausruf) und der zweite ist "Happy Birthday" (wieder kein Ausruf). Haben Sie die Historienerweiterung aktiviert, wenn Sie diesen Test durchführen? jwd vor 9 Jahren 0
@jwd Welche Version von Bash laufen Sie? Ich habe immer seine Expansion an. Hast du versehentlich zwei benutzt !! für deinen Test h4unt3r vor 9 Jahren 0
@ h4unt3r: `Version 4.1.2 (1) -release (x86_64-redhat-linux-gnu)`, auf jeden Fall nur ein `!`. Ich habe "histexpand" in "$ SHELLOPTS". Ich habe jedoch gerade 4.3.18 (2) -release auf einem anderen Rechner ausprobiert, und es verhält sich so, wie Sie es beschrieben haben. Ich denke, es war ein Fehler, der behoben wurde. jwd vor 9 Jahren 0
64
Dennis Williamson

Deaktivieren Sie die Historienerweiterung :

set +H 

oder

set +o histexpand 
Danke - das hat funktioniert, aber ich musste `set + o histexpand` machen, nicht` set -o histexpand`. Könnten Sie Ihre Antwort bearbeiten, um das Problem zu beheben? Matthew vor 14 Jahren 0
Ups, Tippfehler, sorry. Fest. Dennis Williamson vor 14 Jahren 0
ausgezeichnet! suchte dies für AGES .... thx vm! da Flucht nicht funktioniert ... Ich möchte keine einfachen Anführungszeichen verwenden ... Ich werde dies meinem `.bashrc` thx !! hinzufügen, niemals`! `in Skripten und umsonst !! es war immer beunruhigend ... Aquarius Power vor 10 Jahren 0
Das ist so toll! `` `echo" @AquariusPower! "` `` joehanna vor 7 Jahren 0
9
KeithB

Verwenden Sie einfache Anführungszeichen (') anstelle von doppelten Anführungszeichen ("). Bei einfachen Anführungszeichen werden alle Interpretationen der Inhalte deaktiviert, während Anführungszeichen nur bei einigen Anführungszeichen deaktiviert werden.

bzr commit -m 'It works!' 
4
SilversleevesX

Ich habe gerade einen anderen Weg gefunden, der zumindest mit echoZeichenfolgen (Sätzen) funktioniert, die Sie mit einem Ausrufezeichen markieren möchten. Es führt mehr oder weniger einen End-Run um Bash histexpand durch und dauert nur etwas länger zum Code.

Das Hexadezimalzeichen für ein Ausrufezeichen, wie auf http://www.ascii-code.com/ aufgeführt, ist 21. Wenn Sie also \x21am Ende Ihrer Zeichenfolge ein Zeichen setzen echo -e $foo, erstellen Sie $fooein eigenes erweitertes Echo (dh foo=$(echo -e "$foo")Sie) Holen Sie sich, wenn Sie echo $foowieder die Zeichenfolge mit einem !am Ende ist. Und auch kein Wechsel zwischen den Erweiterungen.

Funktioniert sicher in Bash 4+. Frühere Versionen, ymmv.

Hmmm das klappt bei mir nicht. lzap vor 9 Jahren 0