GNU/Linux >> Znalost Linux >  >> Linux

Jak vyloučit příkaz ze seznamu historie, ale ponechat jej v „živé“ historii?

Mezitím se mi podařilo udržet svou historii mnohem čistší díky skvělým tipům od vás, které zahrnují HISTIGNORE možnost v .bashrc , vynechá všechny ty zbytečné ll nebo df -k řádky.

Zjistil jsem však také, že HISTIGNORE možnost je velmi omezující , také.
Například, pokud máte řádek jako tento (zjednodušeně)

HISTIGNORE='ll*:la*:cd*'

nejen že tyto položky budou vynechány ze seznamu , ale také mimo vaši „živou historii“ protože bych chtěl zkopírovat nestálou historii, ke které máte přístup přes Kurzor nahoru /Kurzor dolů . Vyzkoušejte to:budou nyní zcela vynechány, bez ohledu na to, jak dlouho budete procházet historii příkazů pomocí uvedených kurzorových kláves.

Někdy však dělám tyto řádky potřebuji, zvláště s velmi dlouhými a komplikovanými cestami, které nechci přepisovat. Na druhou stranu bych chtěl mít tyto řádky exkluzivní do mé živé historie a neukládat je do seznamu historie protože se budou často měnit.

Existuje nějaký způsob, jak toho dosáhnout?

Jako další poznámku na okraj jsem přišel na to, že z nějakého důvodu se „živá“ historie a seznam historie někdy liší hodně (srov. Proč získám různé výsledky se stejným uživatelem a příkazem historie).

Přijatá odpověď:

Můžete použít HISTIGNORE proměnná prostředí.

Dvojtečkou oddělený seznam vzorů používaných k rozhodování, které příkazové řádky by měly být uloženy do seznamu historie. Například:

export HISTIGNORE="cd*:ls*"

toto bude ignorovat všechny příkazy cd a ls z historie.

EDIT:

omlouvám se, při prvním čtení jsem vaší otázce nevěnoval dostatečnou pozornost. Btw, máte pravdu:HISTIGNORE je velmi těžké nastavení a bash_history bude jednoduše ignorovat každý příkaz, který je uveden v této proměnné (bude jej ignorovat v okamžiku, kdy jej provedete, pokud již existují položky s těmito příkazy ve vašem HISTFILE budou nalezeny zpětným vyhledáváním historie.

Chcete-li nejprve odpovědět na vaši poslední otázku, živá a psaná historie se může velmi lišit, pokud používáte různé terminály současně. Můžete zkusit řešení popsané zde:

Zachovat historii bash ve více oknech terminálu

Dovedete si představit řešení, ve kterém použijete funkci ve svém ~/.bash_logout soubor, který vymaže záznamy historie, které nechcete.

něco takového by mělo dělat to, co chcete:

 function clear_history(){
    # hist_ignore regex, this may be done in a more fancy way, 
    # such as using an env variable, but anyway
    MYHISTIGNORE='^cd:^view:^cat'

    # write down history to file
    history -w

    # create a new tmp file for history
    tmpFile=$(mktemp)
    cp ${HISTFILE}  ${tmpFile}

    # use it to filter history
    for myRegex in $(echo $MYHISTIGNORE | awk 'BEGIN{FS=":"}{for (i=1;i<=NF;i++){print $i}}'); do 
       sed -i "/${myRegex}/d" ${tmpFile}
    done

    # and copy it back to history file
    mv ${tmpFile} ${HISTFILE}
}

Linux
  1. Jak používat příkaz historie v Linuxu

  2. Jak vymazat historii Bash na Linuxu

  3. Jak vyloučit soubory určité velikosti z kopírování v Linuxu

  1. Jak zobrazit seznam modulů načtených nebo povolených v PHP z příkazového řádku

  2. Jaký způsob, jak zabránit přidání příkazu do vaší historie?

  3. Vyloučit seznam adresářů z Unixového příkazu Najít?

  1. Jak vymazat konkrétní příkaz z historie Bash v Linuxu

  2. Jak vyloučit adresář v find . příkaz

  3. Jak si vybavím konkrétní příkaz z historie příkazů, aniž bych jej provedl