2026. február 22., vasárnap

A ~/.bash_history karbantartása

Vannak, akik a Linuxban mindenhez parancssort használnak. Vannak, akik idegenkednek tőle. Én valahol középtájon helyezkedem el: a GUI használatát kényelmesebbnek érzem, de ha egy feladat megoldásához előnyösebb a konzol, azt hívom elő fájdalomérzet nélkül.

Az utóbbi időben gyakoribbá vált a második eset, és úgy gondoltam, nem ártana némi optimalizálás a ~/.bash_history működésében. Természetesen kerestem a neten, hiszen nem célom a kerék újra feltalálása. És kézügyben van az AI segítség is, amely lerövidítheti a megvalósítást. Ilyen forrásokból állt össze az, ami már működik egy ideje, és összeillik az elképzeléseimmel.

A változásokat a ~/.bashrc fájlban kellett elkövetni. Ez a szkript olyankor fut le, amikor elindítjuk a terminálemulátort. Íme az érintett részlet:


export HISTCONTROL=ignoredups:erasedups

export HISTIGNORE="ls:ls -*:cd:cd -:pwd:exit:history"

shopt -s histappend


# Discarding erroneous commands

cleanup_history() {

    local exit_code=$?

    if [ $exit_code -ne 0 ]; then

        history -d $(history 1 | awk '{print $1}') 2>/dev/null

    fi

}


# Synchronization and cleanup after each command

export PROMPT_COMMAND="cleanup_history; history -n; history -w; history -c; history -r; $PROMPT_COMMAND"


# Remove multiple lines on startup

if [ -f "$HISTFILE" ]; then

    tac "$HISTFILE" | awk '!x[$0]++' > /tmp/history_tmpfile &&

    tac /tmp/history_tmpfile > "$HISTFILE"

    rm /tmp/history_tmpfile

fi


A HISTCONTROL ignoredups és erasedups értékei a fölöslegesen duplázott sorok ellen kellenek. A HISTIGNORE felsorol néhány triviális utasítást, amelyeket nem kívánunk tárolni. A histappend azt jelenti, hogy a history fájlt nem újraírjuk, hanem hozzáfűzünk.

A cleanup_history rutin megnézi, hogy a kiadott utasítás hibakód nélkül futott-e le. Tehát pl. elgépelt változatok nem gazdagítják a gyűjteményt. Gemini felhívta a figyelmemet, hogy lehetnek olyan esetek, amikor a hibakód szándékos, és az utasítás ilyenkor is kigyomlálódik. De aki ilyet ad ki, találni fog megoldást erre.

A PROMPT_COMMAND tartalma minden elküldött utasításkor végrehajtódik. Itt meghívjuk a téves parancsok eldobását, valamint szinkronizálunk több egyidejű terminálablak használata esetén.

Végül a feltételes programrész eltávolítja a már (valamikor a tudatosság előtörése előtt) bekerült kettőzött sorokat.