Mir ist klar, dass dies !
im Kontext des Befehlszeilenverlaufs eine besondere Bedeutung für die Befehlszeile hat, aber abgesehen davon kann das Ausrufezeichen in einem ausgeführten Skript manchmal einen Parsing-Fehler verursachen.
Ich denke, es hat etwas mit einer zu tun event
, aber ich habe keine Ahnung, was eine Veranstaltung ist oder was sie tut. Trotzdem kann sich ein Befehl in verschiedenen Situationen unterschiedlich verhalten.
Das letzte Beispiel unten verursacht einen Fehler. aber warum, wenn derselbe Code außerhalb der Befehlsersetzung funktioniert hat? .. mit GNU bash 4.1.5
# This works, with or without a space between ! and p
{ echo -e "foo\nbar" | sed -nre '/foo/! p'
echo -e "foo\nbar" | sed -nre '/foo/!p'; }
# bar
# bar
# This works, works when there is a space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/! p')"; echo "$var"
# bar
# This causes an ERROR, with NO space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/!p')"; echo "$var"
# bash: !p': event not found
protected
Wäre angemessener gewesen. (geschützt durch einfache Anführungszeichen)
var=$(…)
(keine doppelten Anführungszeichen) verwenden, und es wird so funktionieren, wie Sie es erwarten (glaube ich). Dies ist immer noch „sicher“ , weil der Wert Teil einer einfache Zuordnung ist nicht Gegenstand Wort Spaltung oder Globbing (obwohl dies nicht die Zuordnungen wahr sein kann durch builtins erfolgen (zB export
, local
usw.) unter allen Schalen). Leider geht dies nicht über einfache Zuweisungen hinaus, da die doppelten Anführungszeichen den Schutz vor Worttrennung und Globbing bieten und andere Arten der Erweiterung in anderen Kontexten ermöglichen.