Hlavní navigace

Historie příkazů v Bashi aneb vracíme se do budoucnosti

Autor: Universal pictures
Petr Krčmář

Bash je švýcarským nožem každého správného admina. Jeho užitečnou funkcí je ukládání historie příkazů, která má spoustu pokročilých vlastností schopných ještě více ulehčit život. Ukážeme si několik triků.

Doba čtení: 3 minuty

Bash ve výchozím stavu při svém ukončování ukládá historii příkazů do souboru bash_history v domovském adresáři uživatele. Co řádek, to jeden zadávaný příkaz včetně všech parametrů a argumentů. To významně usnadňuje uživateli život, protože je možné se snadno vrátit k předchozím akcím, upravit je a znovu spustit.

Velká část uživatelů končí u toho, že se lze v historii pohybovat pomocí šipek nahoru a dolů. Je toho ale mnohem víc, co se dá s historií dělat.

Vyhledávání

Historie v Bashi umí například fulltextové vyhledávání. K tomu slouží klávesová zkratka Ctrl-R, po jejímž stisknutí na vás vyskočí vyhledávací řádek. Do něj stačí zapisovat libovolný řetězec, který jste v minulosti do příkazové řádky zadali. Může ležet klidně uprostřed řádku, takže může jít například o část cesty, se kterou jste pracovali.

Bash zobrazí nejmladší příkaz, který daný řetězec obsahuje. Pokud chcete vidět starší, opět stiskněte Ctrl-R a posunete se o jeden krok do minulosti. Pokud jste našli, co jste hledali, můžete stisknout Enter a příkaz spustit znovu, případně můžete šipkou doprava přejít k editaci vyhledaného řádku.

Zopakování argumentu

Představte si běžnou situaci: pomocí ls -l jste zjistili velikost souboru, který leží někde hluboko v adresářovém stromu. Rozhodli jste se, že je to ten, který chcete smazat. Chcete tedy na stejnou cestu zavolat příkaz rm. Máte samozřejmě více možností, můžete editovat původní příkaz nebo se můžete vrátit k předchozímu argumentu.

To zařídíte tak, že na prázdný řádek napíšete rm a poté stisknete Alt-. (alt tečka). Bash na místo kurzoru doplní poslední argument předchozího příkazu. Pokud potřebujete poslední argument před-předchozího nebo staršího příkazu, prostě stále mačkáte Alt-. a Bash vám pod rukama argumenty vyměňuje. Pak už stačí jen stisknout Enter.

Vykřičník!

Pro návrat k předchozím příkazům lze jednoduše použít také znak vykřičník. Dva za sebou jednoduše spustí předchozí příkaz, to je poměrně známá věc. Tento zástupný řetězec lze ale použít v libovolném místě řádky, takže pokud při volání balíčkovacího systému zapomenete předřadit sudo a dostanete vynadáno, stačí jednoduše do prázdného řádku zapsat

$ sudo !!

Vykřičník ale umí i vyhledávat, stačí za něj zapsat začátek některého z předchozích příkazů a on jej rád znovu provede.

$ !una
uname -a
Linux masina 4.18.0-0.bpo.1-amd64 #1 SMP Debian 4.18.6-1~bpo9+1 (2018-09-13) x86_64 GNU/Linux

Kromě toho je možné s vykřičníkem cestovat také přesně po krocích, pokud víte, v jakém pořadí jste příkazy volali. Například !-1 zavolá poslední příkaz, analogicky !-2 zavolá předposlední a tak dále.

Právo zapomenout

Bash za normálních okolností ukládá do historie všechny příkazy, které odesíláte. Ne vždy je to ale to, co chcete. Výchozí chování totiž ukládá spoustu duplicit a nedovoluje jednoduše některý příkaz neuložit. To lze snadno změnit zadáním proměnné HISTCONTROL= do souboru .bashrc v domovském adresáři.

Ta má čtyři volby: ignorespace neuloží do historie příkazy začínající mezerou, ignoredups neuloží duplicitní příkaz už jednou v historii uložený, ignoreboth je zkratkou pro obě předchozí volby a erasedups  duplicitní řádek uloží, ale promaže jeho předchozí výskyty v historii. Pokud chcete v proměnné uvést více variant, oddělte je dvojtečkou.

Ignoruj tenhle příkaz

Spouštíte dokola určitou sadu příkazů, která vám pak v historii překáží a vy ji tam nechcete? Bash umí pracovat se seznamem příkazů, které prostě chcete ignorovat. K tomu slouží proměnná HISTIGNORE= uložená opět v .bashrc. Té předáte dvojtečkami oddělený seznam kříkazů, které do historie ukládat nechcete.

HISTIGNORE=ls:history:pwd

Kratší či delší

Bash ve výchozím stavu ukládá 500 nejnovějších příkazů, což pro někoho může být málo, ale pro jiného zase zbytečně hodně. Ovlivnit je to možné proměnnou HISTSIZE= obsahující celé číslo s počtem uložených záznamů. Pokud do něj uložíte nulu, historie se nebude ukládat vůbec.

HISTSIZE=10000

Kdy jsem to dělal?

Historie v Bashi je obvykle ukládána jednoduše za sebou, jak jste příkazy psali. Občas se ale hodí zjistit, kdy přesně jste vy nebo někdo jiný daný příkaz použili. K nastavení ukládání časových značek slouží proměnná HISTTIMEFORMAT= obsahující formátovací řetězec. Ten se může skládat z následujících položek:

  • y: dvouciferý rok
  • Y: čtyřciferný rok
  • m: dvouciferný měsíc
  • d: dvouciferný den v měsíci
  • T: čas ve 24hodinovém formátu
  • %r: datum s 12hodinovým časem
  • %D: datum ve formátu mm/dd/yy

Do .bashrc tak můžete zapsat například:

 HISTTIMEFORMAT="%h %d %H:%M:%S "

Záznam v historii bude potom vypadat následovně:

34  Jun 08 12:31:10 ls -l
35  Jun 08 12:31:19 uname -a
36  Jun 08 12:31:22 pwd
Našli jste v článku chybu?