Fehler von Bash?? Wenn die Einstellung von `$HISTIGNORE` mit `SP`+`*` oder `SP`+`?*` endet

Fehler von Bash?? Wenn die Einstellung von `$HISTIGNORE` mit `SP`+`*` oder `SP`+`?*` endet

Wenn die $HISTIGNOREEndung auf SP+ *oder SP+ gesetzt ist ?*, werden die Dateilisten im aktuellen Ordner mit ihrem Wert verknüpft.

Es ist egal, ob die Angelegenheit extglobfestgelegt oder nicht festgelegt ist.

NG-Beispiel (der aktuelle Ordner hat nur eine Datei „do_music.sh“):

$ export HISTIGNORE="ls:ls *:history:history *:sudo *"
$ echo $HISTIGNORE
ls:ls *:history:history *:sudo do_music.sh
$

OK Beispiel:

$ export HISTIGNORE="ls:ls *:history *:sudo *:history"
$ echo $HISTIGNORE
ls:ls *:history *:sudo *:history
$

Antwort1

Aktualisierung 2

Gemäß meiner ursprünglichen Antwort müssen Sie einfache Anführungszeichen verwenden, damit das *unverändert bleibt. Wenn Sie das tun, HISTIGNOREenthält die Variable nur das *und nicht die Erweiterung. Wenn Sie echo, sehen Sie, dass die Erweiterung stattfindet, weil die Shell $HISTIGNOREdurch ein ersetzt *und dann durch die Dateiliste ersetzt.

Sie können dies überprüfen, indem Sie env | grep HISTIGNOREin beiden Fällen ausführen. Im "-Fall sehen Sie do_music.shdort, im '-Fall sehen Sie das *.

Sie können auch versuchen, die export HISTIGNOREZeile in einem Verzeichnis und echoin einem anderen auszuführen. Sie werden einen Unterschied feststellen, je nachdem, ob Sie verwenden 'oder"

(Ich habe den obigen Teil durchgestrichen, da er sich als falsch herausgestellt hat. Sowohl einfache als auch doppelte Anführungszeichen sollten in Ihrem Fall schließlich funktionieren, da *sie auch in doppelten Anführungszeichen nicht ersetzt werden.)

Aktualisierung 3

Der Grund für dieses echoVerhalten liegt in der Reihenfolge der Ersetzungen in Bash. Laut Handbuch:

       The  order of expansions is: brace expansion; tilde expansion, parameter and vari‐
       able expansion, arithmetic expansion, and command substitution (done in a left-to-
       right fashion); word splitting; and pathname expansion.

Zuerst geschieht dasParameter/VariableErweiterung (die $HISTIGNOREÄnderungen an *), und danach geschieht diePfadnameErweiterung (die *Änderungen in der Dateiliste).

Ursprüngliche Antwort unten

Wenn Sie die erste Zeile ausführen:

export HISTIGNORE="ls:ls *:history:history *:sudo *"

die Shell erweitert zuletzt bereits *die Liste der Dateien in Ihrem Verzeichnis, deshalb gelangen Sie do_music.shan diese Stelle.

Wenn Sie beispielsweise eine Datei mit dem Namen „“ hätten bla:sudo, *:sudowürde diese ebenfalls durch diese ersetzt. Dies ist jedoch nicht der Fall, da keine Datei diesem Muster entspricht.

Um dies zu vermeiden, müssen Sie einfache Anführungszeichen verwenden, um jegliche *Ersetzungen zu vermeiden:

export HISTIGNORE='ls:ls *:history:history *:sudo *'

Aktualisieren

Übrigens ist an HISTIGNORE nichts Besonderes, dies würde für jede Variablendefinition oder jeden Befehl in dieser Hinsicht passieren, wenn Sie *irgendwo in Anführungszeichen ein alleinstehendes Zeichen haben, wird es durch die Liste der Dateien (die nicht mit beginnen .!) im aktuellen Verzeichnis ersetzt (es sei denn, das aktuelle Verzeichnis ist leer oder enthält nur Dateien, die mit beginnen ., in welchem ​​Fall das *so bleibt, wie es ist).

verwandte Informationen