
Wenn die $HISTIGNORE
Endung auf SP
+ *
oder SP
+ gesetzt ist ?*
, werden die Dateilisten im aktuellen Ordner mit ihrem Wert verknüpft.
Es ist egal, ob die Angelegenheit extglob
festgelegt 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, HISTIGNORE
enthält die Variable nur das *
und nicht die Erweiterung. Wenn Sie echo
, sehen Sie, dass die Erweiterung stattfindet, weil die Shell $HISTIGNORE
durch ein ersetzt *
und dann durch die Dateiliste ersetzt.
Sie können dies überprüfen, indem Sie env | grep HISTIGNORE
in beiden Fällen ausführen. Im "
-Fall sehen Sie do_music.sh
dort, im '
-Fall sehen Sie das *
.
Sie können auch versuchen, die export HISTIGNORE
Zeile in einem Verzeichnis und echo
in 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 echo
Verhalten 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.sh
an diese Stelle.
Wenn Sie beispielsweise eine Datei mit dem Namen „“ hätten bla:sudo
, *:sudo
wü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).