3.2. Bash / Interaktivní režim
Řada 2.x vanilkové příchuti Linuxu: Knihy kouzel je od 15. července 2022
do 1. března 2025 ve stavu dlouhodobé pasivní údržby;
nahlášené chyby budou opravovány, ale aktivní vývoj se již věnuje jiným
projektům. Máte-li zájem pokračovat v tvorbě Linuxu: Knihy kouzel
pro novější verze linuxových operačních systémů,
kontaktujte autora nebo rovnou vytvořte odnož.
1. Úvod
Tato kapitola se věnuje využití vlastností interpretu Bash specifických pro jeho interaktivní režim, tedy režim, kdy interpret přijímá příkazy přímo od uživatele (na rozdíl od vykonávání skriptů).
Interpret Bash je vyvíjen v rámci projektu GNU.
2. Definice
- Alias je pokyn intepretu, aby kdykoliv na místě názvu příkazu narazí na určitý název, nahradil tento název předem nastaveným textem (text náhrady obvykle obsahuje příkaz s parametry, ale může to být jakýkoliv text).
- Historie je číslovaný seznam textových řetězců, kam Bash ukládá příkazové řádky zadané v interaktivním režimu, aby je uživatel mohl později snadno opakovaně vyvolat nebo v nich vyhledávat.
3. Zaklínadla
3/1 Ovládání: editace příkazové řádky
@„zpět“: vrátit poslední provedenou úpravu příkazového řádku#1
Ctrl+XU
@vyjmout text od začátku řádku/slova před aktuální znak#2
Ctrl+U
Ctrl+W
@vložit naposledy vyjmutý text#3
Ctrl+Y
@vyjmout text od aktuálního znaku do konce řádky/slova#4
Ctrl+K
Alt+K
@přejít na začátek/konec příkazové řádky#5
Home
End
@vložit na příkazový řádek tabulátor#7
Ctrl+V
Tab
3/2 Ovládání: práce s historií
@zopakovat poslední příkaz#1
↑
Enter
@posouvat se v historii po jednotlivých příkazech zpět/vpřed#2
↑
↓
@vyhledávat v historii směrem zpět#3
Ctrl+R
Zadat vyhledávaný podřetězec. Další ovládání: Enter, Esc, ↑, ↓, Shift+Alt+..
@návrat na konec historie (zpravidla po nepovedeném vyhledávání)#4
Shift+Alt+.
@vrátit řádek načtený z historie do původního stavu#5
Alt+R
3/3 Ovládání: ostatní
@pokusit se doplnit parametr nalevo od kurzoru#1
Tab
@smazat terminál (ponechat aktuální řádku)#2
Ctrl+L
@posun terminálu o stránku nahoru/dolu#3
Shift+PageUp
Shift+PageDown
3/4 Aliasy (včetně zapnutí/vypnutí)
@vypsat přehled aliasů#1
alias
@nastavit alias (obecně/příklad)#2
alias identifikator="text" [dalsiidentifikator="text"]
alias ls='printf %s\n "Výpis souborů:"; ls -l'
@test: je identifikátor alias?#4
alias identifikator &>/dev/null
@vypnout/zapnout aliasy#5
shopt -u expand_aliases
shopt -s expand_aliases
3/5 Nápověda k příkazům
@vypsat nápovědu pro vestavěný příkaz/všechny vestavěné příkazy#1
help [-m] příkaz
help [-m] "*"
@určit typ příkazu#2
type [-t] název_příkazu
3/6 Nastavení historie
@vypnout rozvoj historie (doporučuji)#1
set +H
@maximální počet záznamů v historii v paměti/na disku#2
HISTSIZE=počet
HISTFILESIZE=počet
@byl-li proveden rozvoj historie, zobrazit příkaz před provedením ke kontrole#3
shopt -s histverify
@vypnout historii příkazů úplně/zapnout ji#4
set +o history; history -c
set -o history
@nastavit, kam se ukládá historie (obecně/příklad)#5
HISTFILE="/absolutní/cesta-k-souboru"
HISTFILE="/home/aneta/.bash_history"
@víceřádkové příkazy ukládat do historie: najednou/po řádcích#6
shopt -s cmdhist
shopt -u cmdhist
HISTCONTROL="[volba[:další-volba]]"
HISTCONTROL="ignorespace:erasedups"
@neukládat do historie příkazy začínající určitými řetězci/obsahující určité řetězce na první řádce#8 (6)
HISTIGNORE="řetězec*[:další řetězec*]"
HISTIGNORE="*řetězec*[:*další řetězec*]"
@ukládání historie při ukončení bashe: připojit na konec/přepsat soubor#9
shopt -s histappend
shopt -u histappend
3/7 Historie (kromě nastavení)
@vypsat posledních N záznamů#1
history N
@ručně přidat do historie příkaz#2
history -s 'příkaz s parametry'
history -d -1
history -d číslo-záznamu
history -c
3/8 Nastavení (kromě historie a aliasů)
@snažit se opravit překlepy v parametru příkazu „cd“ (zapnout/vypnout)#2
shopt -s cdspell
shopt -u cdspell
@nerozlišovat velká a malá písmena ve většině kontextů (zapnout/vypnout)#3
shopt -s nocasematch
shopt -u nocasematch
4. Instalace na Ubuntu
GNU Bash a všechny příkazy použité v této kapitole jsou základními součástmi Ubuntu přítomnými i v minimální instalaci.
5. Tipy a zkušenosti
- Bash se o rozvoj aliasů snaží opakovaně, ale s ochranou proti nekonečné rekurzi — u každého názvu příkazu si pamatuje, z rozvoje jakých aliasů vznikl a ty už znovu nerozvine. Proto je bezpečné nastavit např. „alias ls='ls -R'“.
- Častá začátečnická chyba je „alias ls=ls -l“; název a text aliasu je nutno předat v jednom parametru a všechny zvláštní znaky je třeba odzvláštnit, jinak se vyhodnotí okamžitě a ne až po rozvinutí aliasu.
- Doporučuji všem uživatelům vypnout v souboru „.bashrc“ rozvoj historie příkazem „set +H“. Ovládání pomocí klávesových šipek, Ctrl+R, příkazu „fc“ apod. je pro přístup do historie mnohem praktičtější a vypnutí rozvoje historie vám umožní používat znaky „!“ a „^“ v interaktivním režimu bez nutnosti odzvláštnění (stejně jako ve skriptech).
- Rozvoj aliasů se provádí ještě před jakýmkoliv dalším zpracováním příkazového řádku; dokonce můžete nastavit „alias x="echo '" a pak zadat „x Proměnná $PATH'“ a bude to fungovat — $PATH se nerozvine!
- Vyhledávání Ctrl+R má nevýhodnou vlastnost, že v případě překlepu můžete přesáhnout za hledanou pozici a zpět se nemůžete vrátit bez smazání již zadaných písmen. Bash sice nabízí i funkci pro vyhledávání bez této nepříjemné vlastnosti, ale nepodařilo se mi ho zprovoznit.
- Klávesovou zkratku Ctrl+XE můžete využít pro zadání komplikovanějšího příkazu i v momentě, kdy je příkazová řádka ještě prázdná.
6. Další zdroje informací
- BRANDEJS, Michal. Linux: Praktický průvodce. Brno: Konvoj, 2003. 2. vyd. (v Konvoji 1.) ISBN 80-7302-050-5. Kapitola 4.
- Bash History Builtins (anglicky)
- TL;DR: history (anglicky)
7. Zákulisí kapitoly
V této verzi kapitoly chybí:
- bind (mapování kláves)
- fc (vykonání příkazu z historie)
Tato kapitola záměrně nepokrývá:
- Nastavení terminálu a výzvy (viz kapitolu Terminál)
1 Použitý editor je určený proměnnou prostředí EDITOR; ve výchozím nastavení je to na Ubuntu „nano“.
2 Opakovaným stiskem lze vložit poslední slovo z předposlední řádky, před-předposlední atd.
3 Tyto klávesové zkratky lze (velmi výhodně) použít i tehdy, když Bash není na popředí! Program vypisující na terminál dál poběží (pokud ho chcete přerušit, použijte Ctrl+Z).
4 Pozor na rozdíl oproti příkazu „unset“ — mazaný alias musí existovat, jinak příkaz „unalias“ selže.
5 Rozeznávané volby jsou: „ignorespace“ (neukládat řádky začínající bílým znakem), „ignoredups“ (neukládat stejný řádek znovu) a „erasedups“ (před uložením řádky smazat všechny stejné řádky z celé historie – pozor, tato volba mění pořadová čísla řádek v historii). Volba „ignoreboth“ (což je v Ubuntu výchozí chování) je synonymum pro „ignorespace:ignoredups“.
6 Pozor: řetězce jsou zde ve skutečnosti vzorky, takže se vyvarujte jakýchkoliv zvláštních znaků, nebo si nastudujte v manuálové stránce bashe, jak proměnná HISTIGNORE ve skutečnosti funguje.
7 Pozor! Tento příkaz bude fungovat, pokud
8 Poznámka k příkazu „history -d -2“: tento příkaz ve skutečnosti maže předposlední záznam, ale když takový příkaz zadáte, vámi zadaný řádek se uloží do historie ještě před smazáním předpokládá, že se vámi zadaný příkazový řádek do historie před provedením uloží. (Příkaz „history -d -1“ by totiž v takovém případě smazal právě ten nově uložený řádek, namísto řádky, která už v historii byla. )
9 Pozor, limit se počítá od zobrazení výzvy a když doběhne, intepret se ukončí, a to i v případě, že příkaz teprve zadáváte. Poznámka: Uvedená hodnota se prý aplikuje také na vestavěný příkaz „read“, pokud ten nemá zadán vlastní časový limit.
Líbí se vám tento projekt a chcete, aby byl ještě lepší? Můžete mi s tím pomoci. Zmiňte se o něm technicky zdatným přátelům, opravte překlepy a nahlašte nefunkční zaklínadla, aby mohla být opravena; poskytněte mi zpětnou vazbu nebo se zapojte do vývoje nových kapitol. Další informace na GitHubu v dokumentu Jak se zapojit.