[linux-l] Bash und History

Mike Dornberger Mike.Dornberger at gmx.de
Mi Nov 19 09:14:47 CET 2008


Hi,

On Mon, Nov 17, 2008 at 08:17:58PM +0100, Norman Steinbach wrote:
> Mit der Opion "erasedups" sind nämlich zwar die Doppel-Einträge aus der
> .bash_history verschwunden, aber wenn man den MC benutzt, dann kommen
> dafür statt dessen wieder solche netten Einträge hinzu, wie diese hier:
> >  cd "`printf "%b" '\0057home\0057norman\0057Data'`"
> >  cd "`printf "%b" '\0057home\0057norman\0057Data\0057Text\0057tech'`"
> 
> Und ich bin mir zu 100% sicher, dass die manpage von bash hier *nicht*
> weiterhelfen kann - daher verknüpfe ich dieses Beispiel auch gleich mal

ich bin mir zu 100% sicher, daß sie es doch kann. :p

Lies den Abschnitt zu HISTCONTROL in der `man bash' noch einmal. Da findest
du einen Hinweis auf HISTIGNORE. (Zugegeben, der Hinweis in Debian Sarges
Version der man page mit dem Satz "This variable's function is superseded
by HISTIGNORE." ist ein deutlicherer Hinweis, das mal zu lesen.)

NB: Beim kurzen Überfliegen der MC man page ist mir nicht so ganz klar
geworden, ob MC spezielle Umgebungsvariablen setzt, anhand derer man
feststellen kann, ob er als übergeordneter Prozeß läuft. Dann könnte man das
relativ trivial in der ~/.<yourshell>rc (o. ä.) testen und spezielle Dinge
einstellen, z. B. history ignore-Muster. (Nach dem kurzen Überfliegen sieht
es eher so aus, als ob das nicht getan wird.) Für Bash-Nutzer kann man das
aber relativ leicht nachholen. Als Resource-Control-Datei wird dann
~/.mc/bashrc benutzt. Dort kann man dann z. B.

--- 8< ---
export MC_RUNNING=1
test -e ~/.bashrc && . ~/.bashrc
--- >8 ---

setzen und in der "Hauptdatei" dann z. B. HISTIGNORE setzen. Das Muster zu
bauen, welches die 'cd printf'-Zeilen ausfiltert, sei dem geneigten Leser
als Übung überlassen. Das Ergebnis ist zur Prüfung und Diskussion durch die
Allgemeinheit zu veröffentlichen. ;)

Gruß,
 Mike

PS: Ältere Versionen der Bash kennen die Option erasedups nicht. ignoredups
sollte dort ausreichend sein, da die alten Duplikate mit der Zeit von allein
aus der ~/.bash_history (oder $HISTFILE) verschwinden sollten.

Falls man händisch Duplikate entfernen will, hilft z. B. folgendes (Achtung,
eine Zeile):

$ history -w; perl -ni.orig -e 'next if $oldline eq $_; print; $oldline=$_' ~/.bash_history; history -c; history -r

Und mit "ein wenig" Quoting bekommt man die letzte Zeile auch noch in die
History >:) :

$ line='history -s "line='\''`printf "%s" "$line" | sed -e '\''s/\('\''\'\'''\''\)/\1\\\\\1\1/g'\''`'\''; eval \"\$line\""; history -w; perl -ni.orig -e '\''next if $oldline eq $_; print; $oldline=$_'\'' ~/.bash_history; history -c; history -r'; eval "$line"



Mehr Informationen über die Mailingliste linux-l