Hlavní navigace

Hrátky z řádky: zpátky do historie

Petr Macek 16. 6. 2008

Opět se setkáváme u pondělní dávky tipů a triků z černé řádky. Historii příkazů jsme probírali, dnes si ji rozebereme trošku víc. Máte například možnost si nastavit, co do historie ukládat a neukládat, rychlé spouštění z historie... Vše se týká bash, v jiných shellech se s historií pracuje jinak.

Nastavení

Historie se ukládá do našeho domovského adresáře do souboru .bash_history. Pokud se nám to nelíbí, můžeme si pomocí proměnné HISTFILE nastavit jiné umístění. Máme i další proměnné, kterými můžeme chování historie ovlivnit. Ve výchozím stavu se do souboru s historií ukládá posledních 500 příkazů. Pokud jich chceme třeba víc, změnte hodnotu proměnné HISTFILESIZE. Když zadáte příkaz history, zobrazí se ve výchozím stavu také 500 záznamů. To lze ovlivnit proměnnou HISTSIZE nebo pokud to chceme jednorázově, použijte příkaz history 10. Desítka udává počet požadovaných záznamů.

Pokud by vás zajímalo, kdy byl který příkaz spouštěn, nastavte si po přihlášení proměnnou HISTTIMEFORMAT. Třeba do ~/.bashrc přidejte:

$ export HISTTIMEFORMAT='%Y-%m-%d %H:%M '

Do souboru se bude ukládat i timestamp a výstup programu history bude:

523  2008-06-15 10:55 ls -al

Pokud nechceme některé příkazy do historie ukládat vůbec, stačí nastavit další proměnnou HISTIGNORE=uptime:ls. Odteď nebudou příkazy uptime a ls do historie ukládány. Tady pozor, HISTIGNORE očekává patterny, takže třeba ls -al se uloží. Můžeme používat zástupné znaky, třeba hvězdičku.

Poslední užitečnou proměnnou je HISTCONTROL. V nenastaveném stavu ukládá do historie každý příkaz. Můžeme nastavit několik hodnot:

  • ignorespace  – do historie se neukládá řádek začínající mezerou. To se může hodit u některých příkazů vyžadujících heslo (napadá mne třeba testsaslauthd -u username -p password)
  • ignoredups – zabraňuje duplicitám, pokud zavoláte hned po sobě několikrát stejný příkaz, uloží se jen jednou
  • ignoreboth – oba předcházející společně

Hledání

Tím jsme si vysvětlili, jak je možné ovlivnit chování, teď se podíváme na hledání v historii a její efektivní využití. Můžeme si třeba nějaký příkaz grepnout:

$ history | grep prikaz

To je ale dlouhé na psaní, trošku si pomůžeme aliasem:

$ export alias his="history | grep "

Potom stačí zadat his prikaz a zobrazí se nám všechny výskyty příkazu.

Ale bash umí víc. Pomocí šipek nahoru a dolů se můžeme pohybovat v historii příkazů. Stejnou věc nám umožní i ctrl+p (previous) a ctrl+n (next). Asi nejčastější hledání budete provádět kombinací ctrl+r. Objeví se dialog a do toho můžete začít psát. Najde se naposledy použitý příkaz obsahující daný výraz. Pokud chceme starší nález, stačí zmáčknout kombinaci znovu. A samozřejmě můžeme dál používat šipky, tím se dostáváme od hledaného příkazu nahoru nebo dolů v historii. Enterem provedeme spuštění příkazu, pomocí ctrl+j ukončíme hledání a můžeme vyhledaný příkaz editovat. Pokud příkaz použít nechceme, pomocí ctrl+c můžeme hledání ukončit.

Spouštění

Když chceme rychle spustit nějaký program z historie, stačí zadat:

!prikaz

První odpovídající z historie začínající ‚prikaz‘ se najde a provede. Je to hodně rychlé a trochu nebezpečné, někdy si nemusíte být jisti, co spouštíte. Podobná věc je:

!?slovo

Rozdíl je pouze v tom, že hledá slovo v příkazu a ne jen na začátku. Pomocí !! též můžete spustit poslední příkaz. Příkaz history na začátku řádku vypisuje pořadové číslo příkazu. Další možnost, jak příkaz spustit, je použít právě ono číslo:

!cislo

Pomocí shopt můžeme ale ovlivnit chování !prikaz,!cislo, … . Pokud spustíme:

$ shopt -s histverify

Příkaz se hned nevykoná, máme ještě možnost jej upravit. Opět to můžeme strčit třeba do .bashrc.

Velice pěkná věc je spuštění více příkazů z historie za sebou. Vyhledáte si třeba pomocí ctrl+r první příkaz z požadované sekvence příkazů. Místo enteru ale zmáčkněte ctrl+o. Příkaz se vykoná a do příkazové řádky se vloží následující v historii. Když znovu zmáčknete ctrl+o, opět se vykoná a připraví další. Pokud následující ukončíte Enterem, dál se v historii pokračovat nebude.

Pokud chceme smazat historii, není nutné rovnou smazat soubor .bash_history. Příkaz history -c nám smaže historii, history -r smaže pouze historii právě probíhajícího sezení.

Našli jste v článku chybu?

16. 6. 2008 1:18

Nez nekdo zase napise, ze clanky na rootu stoji za hov*o, tak chci podekovat za clanek. To je presne ta vec, ktera se hodi, ale do vetsiny clanku o shellu se uz nevlezla :)

20. 6. 2008 10:00

Napets (neregistrovaný)
Pekny den,
jen maly dodatek viz drivejsi clanek http://www.root.cz/clanky/drobnosti-ze-shelloveho-zapisniku-4/

Chcete-li, aby se každý příkaz ihned po svém dokončení zapsal do historie, můžete PROMPT_COMMAND nastavit na history -a. Následující nastavení pak umožňuje okamžité sdílení historie mezi několika instancemi shellu, což ocení hlavně ti, kteří mají běžně otevřeno deset příkazových oken:

PROMPT_COMMAND='history -a ; history -n'




Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Lupa.cz: Není sleva jako sleva. Jak obchodům nenaletět?

Není sleva jako sleva. Jak obchodům nenaletět?

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Podnikatel.cz: EET zvládneme, budou horší zákony

EET zvládneme, budou horší zákony

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?