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}
}