Bitte schauen Sie sich diese Befehle an:
$ notify-send SYNC TIME!
$ notify-send 'SYNC TIME!'
$ notify-send "SYNC TIME!"
bash: !": event not found
$
Die ersten beiden Befehle erzeugen erwartungsgemäß eine Benachrichtigungsblase. Der dritte gibt den angezeigten Fehler an.
und
$ echo SYNC TIME!
SYNC TIME!
$ echo 'SYNC TIME!'
SYNC TIME!
$ echo "SYNC TIME!"
bash: !": event not found
$
Auch hier echo
funktioniert das für die ersten beiden Befehle, aber nicht für den dritten.
Weitere Probleme hier (obwohl ich dies nicht vorhatte): beides notify-send "SYNC!TIME"
und echo "SYNC!TIME"
geben bash: !TIME": event not found
.
Aber beides notify-send
und echo
arbeiten mit"SYNC! TIME"
Kann mir bitte jemand erklären, warum der bash: !": event not found
Fehler auftritt?
.bashrc
die Leitung ergänzenset +H
. Beachten Sie, dass dies!
in Skripten bereits keine Besonderheit ist. Wenn Sie es als etwas Besonderes behandeln, können viele standardkonforme Skripte beschädigt werden. Es wird nur in interaktiven Shells als "speziell" behandelt und standardmäßig nur, bis Sie es beheben. :-)Da es sich bei bash
!
um ein reserviertes Wort (OK, Zeichen) handelt, hat es in verschiedenen Kontexten eine besondere Bedeutung. In diesem speziellen Fall geraten Sie in Konflikt mit seiner Bedeutung bei der Historiensuche. Vonman bash
:Grundsätzlich bedeutet dies, dass Bash die Zeichen nach dem in
!
Ihrem Verlauf nach dem ersten gefundenen Befehl durchsucht, der mit diesen Zeichen beginnt. Es ist einfacher zu demonstrieren als zu erklären:Die
!
aktivierte Verlaufserweiterung, die dem ersten Befehl entsprach, der mite
dem zuvor ausgeführten Befehl begann ,echo foo
der dann erneut ausgeführt wurde. Als Sie also geschrieben haben"SYNC TIME!"
, hat bash den!"
Verlauf nach einem Befehl durchsucht, der mit ""
fehlgeschlagen" begann, und sich darüber beschwert. Sie können den gleichen Fehler erhalten, indem Sie beispielsweise ausführen!nocommandstartswiththis
.Um ein Ausrufezeichen zu drucken, müssen Sie es auf eine der beiden folgenden Arten maskieren:
quelle
echo Hello world!
funktioniert --- Geschichte Erweiterung wird nicht durch Leerzeichen ausgelöst ;-) (ah, die schönen!
ist ein reserviertes Wort inbash
, wie POSIX auch deklariert . Aber ich bin mir ziemlich sicher, dass sein Status völlig unabhängig von seiner Rolle bei der Erweiterung der Geschichte und irrelevant für seine Behandlung in doppelten Anführungszeichen ist.!
ist ein reserviertes Wort, da es den Exit-Status eines Befehls / einer Pipeline negiert und daher nicht als Befehl verwendet werden kann. Kein anderes reserviertes Wort ist etwas Besonderes in einem"
-quoted Kontext, während$
ist nicht ein reserviertes Wort , sondern wird speziell behandelt.