Opravdu mě baví používat control+r
rekurzivně prohledávat historii mých příkazů. Našel jsem několik dobrých možností, které s ním rád používám:
# ignore duplicate commands, ignore commands starting with a space
export HISTCONTROL=erasedups:ignorespace
# keep the last 5000 entries
export HISTSIZE=5000
# append to the history instead of overwriting (good for multiple connections)
shopt -s histappend
Jediný problém pro mě je, že erasedups
vymaže pouze sekvenční duplikáty – takže s tímto řetězcem příkazů:
ls
cd ~
ls
ls
příkaz bude ve skutečnosti zaznamenán dvakrát. Přemýšlel jsem o pravidelném spouštění s cronem:
cat .bash_history | sort | uniq > temp.txt
mv temp.txt .bash_history
Tím by se docílilo odstranění duplikátů, ale pořadí by bohužel nebylo zachováno. Pokud sort
soubor nejprve nevěřím uniq
může fungovat správně.
Jak mohu odstranit duplikáty v mé .bash_history, zachování pořadí?
Kredit navíc:
Jsou nějaké problémy s přepsáním .bash_history
soubor přes skript? Pokud například odstraníte soubor protokolu Apache, myslím, že musíte odeslat signál nohup / reset pomocí kill
aby vyprázdnil jeho připojení k souboru. Pokud je to případ .bash_history
soubor, možná bych mohl nějak použít ps
zkontrolovat a ujistit se, že před spuštěním filtrovacího skriptu nejsou žádné připojené relace?
Přijatá odpověď:
Řazení historie
Tento příkaz funguje jako sort|uniq
, ale udržuje čáry na místě
nl|sort -k 2|uniq -f 1|sort -n|cut -f 2
V podstatě se před každý řádek připojuje jeho číslo. Po sort|uniq
-ing, všechny řádky se seřadí zpět podle jejich původního pořadí (pomocí pole s číslem řádku) a pole s číslem řádku se z řádků odstraní.
Toto řešení má tu chybu, že není definováno, který zástupce třídy stejných čar se dostane na výstup, a proto není jeho pozice ve výsledném výstupu definována. Pokud by však měl být vybrán nejnovější zástupce, můžete sort
vstup druhým tlačítkem:
nl|sort -k2 -k 1,1nr|uniq -f1|sort -n|cut -f2
Správa .bash_history
Pro opětovné načtení a zapsání historie můžete použít history -a
a history -w
respektive.