Ich habe versucht, ein Skript zu erstellen, indem ich echo
den Inhalt in eine Datei geschrieben habe, anstatt ihn mit einem Editor zu öffnen
echo -e "#!/bin/bash \n /usr/bin/command args" > .scripts/command
Die Ausgabe :
Bash:! / bin / Bash: Ereignis nicht gefunden
Ich habe dieses seltsame Verhalten auf den Knall beschränkt .
$ echo !
!
$ echo "!"
bash: !: event not found
$ echo \#!
#!
$ echo \#!/bin/bash
bash: !/bin/bash: event not found
- Warum verursacht Knall das?
- Was sind diese "Ereignisse", auf die sich Bash bezieht?
- Wie komme ich an diesem Problem vorbei und drucke "#! / Bin / bash" auf den Bildschirm oder meine Datei?
command-line
bash
echo
Stefan
quelle
quelle
$''
. Zum Beispielecho $'1!\n2!\n3!\n'
druckt jede Zahl, gefolgt von einem Knall und einem Zeilenumbruch.echo '0123'"$var"'456'
notiere zwei Paare einfacher Anführungszeichen und ein Paar doppelter Anführungszeichen.Wie Richm sagte , versucht Bash, ein Historienspiel zu machen . Eine andere Möglichkeit, dies zu vermeiden, besteht darin, einfach dem Knall zu entkommen
\
:Beachten Sie, dass in Anführungszeichen Folgendes
\
nicht entfernt wird:quelle
"\!"
erweitert eigentlich\!
nicht!
, angeblich für POSIX - Konformität.!
in doppelten Anführungszeichen ohne magisches Verhalten zu fliehen ? Das ist verrückt ...!
Startet eine Historiensubstitution (ein „Ereignis“ ist eine Zeile in der Kommandogeschichte); Zum Beispiel wird!ls
auf die letzte Befehlszeile mitls
und!?foo
auf die letzte Befehlszeile mit erweitertfoo
. Sie können auch bestimmte Wörter extrahieren (!!:1
bezieht sich z. B. auf das erste Wort des vorherigen Befehls) und mehr. Einzelheiten finden Sie im Handbuch.Diese Funktion wurde erfunden, um frühere Befehle in den Tagen, als die Befehlszeilen-Edition noch primitiv war, schnell wieder aufzurufen. Mit modernen Shells (mindestens bash und zsh) und Copy-and-Paste ist die Verlaufserweiterung nicht mehr so nützlich wie früher - sie ist immer noch hilfreich, aber Sie können ohne sie auskommen.
Sie können ändern, welches Zeichen die Ersetzung des Verlaufs auslöst, indem Sie die
histchars
Variable festlegen. Wenn Sie die Protokollersetzung selten verwenden, können Sie z. B. festlegenhistchars='¡^'
, dass¡
die Protokollerweiterung statt ausgelöst wird!
. Sie können die Funktion mit sogar ganz ausschaltenset +o histexpand
.quelle
Um die Verlaufserweiterung in einer bestimmten Befehlszeile deaktivieren zu können, können Sie
space
als 3. Zeichen Folgendes verwenden$histchars
:Wenn Sie dann Ihren Befehl mit einem führenden Leerzeichen eingeben, wird die Verlaufserweiterung nicht ausgeführt.
Beachten Sie jedoch, dass führende Leerzeichen auch verwendet werden, wenn sie
$HISTCONTROL
enthaltenignorespace
, umbash
zu verhindern, dass eine Befehlszeile im Verlauf aufgezeichnet wird.Wenn Sie beide Funktionen unabhängig voneinander verwenden möchten, müssen Sie ein anderes Zeichen als 3. Zeichen von auswählen
$histchars
. Sie möchten eine, die sich nicht auf die Art und Weise auswirkt, wie Ihr Befehl interpretiert wird. Ein paar Möglichkeiten:\
):\echo foo
funktioniert, hat aber den Nebeneffekt, dass Aliase oder Schlüsselwörter deaktiviert werden.wenn Sie nichts dagegen haben zwei Tasten eingeben, können Sie ein beliebiges Zeichen auswählen , die normalerweise nicht in der ersten Position angezeigt wird (
%
,@
,?
, Ihre eigenen Pick) und einen leeren Alias für sie machen:Geben Sie dann das Zeichen, das Leerzeichen und Ihren Befehl ein:
(Sie können jedoch keinen Befehl aufzeichnen, bei dem die Protokollersetzung deaktiviert wurde. Beachten Sie außerdem, dass das dritte Standardzeichen von nicht in Kommentaren angezeigt
$histchars
wird#
. Wenn Sie es ändern, geben Sie Kommentare in das Feld ein sollten Sie sich darüber im Klaren sein, dass! Sequenzen dort erweitert werden können).quelle
Die vorgeschlagenen Lösungen funktionieren nicht, z. B. im folgenden Beispiel:
In diesem Fall kann der Knall mit seinem oktalen ASCII-Code gedruckt werden:
quelle
!
zwischen doppelten Anführungszeichen, wobei andere Antworten darauf hinweisen, dass es seine historische Erweiterungsbedeutung beibehält. Sie könntenbash -c 'echo '\''hello World!'\'
oder verwendenbash -c "echo 'hello World"\!"'"
.Seit Bash 4.3 können Sie doppelte Anführungszeichen verwenden, um das Verlaufserweiterungszeichen zu zitieren:
quelle
!
folgt nur, dass das"
nichts Besonderes mehr ist.echo "foo!"
ist in Ordnung,echo "foo!bar"
ist nicht