Linux: Kniha kouzel, vanilková příchuť 2.14 (15. července 2022)
Veškerá moc příkazové řádky/příkazového řádku přehledně, pro začátečníky i pokročilé

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
@otevřít zadávaný příkaz v editoru jako skript a po uzavření editoru vykonat#6 (1)
Ctrl+XE
@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
@vložit poslední slovo z poslední řádky v historii#6 (2)
Alt+.

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
@pozastavit výpis na terminál/pokračovat#4 (3)
Ctrl+S
Ctrl+Q

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'
@smazat alias#3 (4)
unalias identifikator [2>/dev/null || true]
@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
@nastavit způsob ukládání řádek do historie (obecně/příklad)#7 (5)
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'
@smazat z historie poslední záznam (viz poznámku)#3 (7)
history -d -1
@smazat z historie poslední záznam/konkrétní záznam/všechny záznamy#4 (8)
history -d -1
history -d číslo-záznamu
history -c

3/8 Nastavení (kromě historie a aliasů)

@nastavit/zrušit časový limit na zadání příkazu #1 (9)
TMOUT=N
unset TMOUT
@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.
[BY-SA]

Veškerý obsah této stránky (text, obrázky, zdrojový kód) je možno upravovat a šířit pod podmínkami licence Creative Commons Attribution-ShareAlike 4.0 International. Upozorňuji, že uvedená licence vyžaduje uvedení seznamu autorů, licence a zdroje a poskytnutí stejné či kompatibilní licence k provedeným změnám, jsou-li nějaké. Příslušné údaje jsou dostupné na stránce „Přehled autorů“. Šíření obsahu bez těchto údajů nebo šíření upravené verze bez poskytnutí adekvátní licence k provedeným úpravám je pravděpodobně porušení licenčních podmínek a může být postihováno. Poskytování zdrojového kódu při šíření není touto licencí vyžadováno.

Pro nové verze, další informace, aktuální zdrojový kód a možnost se zapojit do projektu „Linux: Kniha kouzel“ navštivte jeho repozitář na GitHubu.