Ř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ž.
Bash je výchozí interpret příkazového řádku v Ubuntu (a většině dalších
linuxů). Tato kapitola se zabývá jeho funkcemi, které nejsou pokryty
v jiných kapitolách, zejména přepínači nastavení, prací s návratovým kódem
příkazů a některými užitečnými rozvoji. Ostatní vlastnosti Bashe najdete
v podkapitolách této kapitoly, popř. ve zcela samostatných kapitolách.
Návratový kód (exit status) je celočíselný kód (0 až 255) vracený každým příkazem (s výjimkou přiřazení do proměnné či definice funkce), který indikuje, zda příkaz ve své činnosti uspěl (0) nebo ne (1 až 255).
Podprostředí (subshell) je částečně izolované prostředí pro vykonávání příkazů. Příkazy v podprostředí se chovají, jako by byly spuštěny v novém, odděleném procesu, až na to, že získají kopii všech proměnných (tzn. nejen exportovaných), deskriptorů a nastavení interpretu. Jakékoliv změny proměnných či nastavení interpretu, které provedou, však nemají účinek mimo podprostředí (na to je třeba si dát pozor zvlášť u příkazu „read“). Podprostředí má jako celek svůj návratový kód a jako na celek na něj mohou být aplikována přesměrování.
@pokud vzorek při rozvoji cest neodpovídá žádné cestě: selhat s chybou (doporučuji)/předat vzorek tak, jak je (výchozí chování, nedoporučuji)/předat prázdný řetězec#1
shopt -s failglob
shopt -u failglob nullglob
shopt -s nullglob; shopt -u failglob
@konstrukci „**“ při rozvoji cest interpretovat jako libovolnou (i prázdnou) posloupnost adresářů (zapnout/vypnout)#2
shopt -s globstar
shopt -u globstar
@rozsahy ve vzorcích při rozvoji cest (např. „[A-Z]“) intepretovat: podle locale „C“/podle aktuálního locale#3
shopt -s globasciiranges
shopt -u globasciiranges
@zahrnout do rozvoje cest i skryté soubory a adresáře (zapnout/vypnout)#4 (10)
shopt -s dotglob
shopt -u dotglob
@velká a malá písmena při rozvoji cest: rozlišovat/nerozlišovat#5
shopt -s nocaseglob
shopt -u nocaseglob
@rozvoj neexistující proměnné: považovat za kritickou chybu/tiše ignorovat#6 (11)
@symbolické odkazy v cestě k aktuálnímu adresáři: jednorázově rozvinout/pamatovat si (výchozí)#1
set -P
set +P
@kontrolovat velikost okna a aktualizovat zvláštní proměnné COLUMNS a LINES (zapnout/vypnout)#2
shopt -s checkwinsize
shopt -u checkwinsize
@příkazy „.“ a „source“ budou při hledání svého argumentu prohledávat: cesty v PATH a nakonec aktuální adresář (výchozí chování)/jen aktuální adresář#3
shopt -s sourcepath
shopt -u sourcepath
@příkaz „echo“ bez parametrů „-e“ a „-E“ sekvence se zpětným lomítkem: interpretuje/neinterpretuje#4
shopt -s xpkg_echo
shopt -u xpkg_echo
@při každém vytvoření či přiřazení proměnné či funkce z ní učinit proměnnou prostředí (zapnout/vypnout)#5
set -a
set +a
@řízení úloh příkazy „fg“ a „bg“ a zkratkou Ctrl+Z (zapnout/vypnout)#6
set -m
set +m
@už nenačítat další řádek příkazů; po vykonání příkazů z tohoto řádku skončit (zapnout/vypnout)#7
set -t
set +t
@přepsání existujícího souboru obyčejným přesměrováním výstupu (zakázat/povolit)#8
set -C
set +C
@pokud není argument příkazu cd nalezen jako adresář, zkusit dereferencovat proměnnou téhož názvu (zapnout/vypnout)#9
Popis proměnných PS0, PS1 a PS2 najdete v kapitole „Terminál“.
@pokud název příkazu neobsahuje lomítko a neodpovídá identifiátoru aliasu, funkce či vestavěného příkazu, hledat program ke spuštění v těchto adresářích#1
Pozor na implicitní vznik podprostředí v některých situacích! Bash automaticky obklopí podprostředím každý příkaz dvou- či vícečlenné roury a také i jednoduchý příkaz spouštěný na pozadí. To znamená, že např. tento blok kódu vypíše „19“, protože přiřazení z konstrukce „:=“ zůstalo izolované v podprostředí:
unset a
true "${a:=12}" &
wait $!
printf %s\\n "${a:=19}"
Častěji se tato chyba vyskytuje ve formě pokusu o použití příkazu „read“ s rourou:
unset a
printf 99\\n | IFS= read -r a
printf %s\\n "$a"
V uvedeném příkladu zůstane hodnota „a“ nedefinovaná, protože ho Bash uzavře do
samostatného podprostředí.
Operátor kartézského součinu slouží ke generování parametrů, kde se
na určené místo textu parametru postupně dosazují zadané podřetězce
v uvedeném pořadí, např.:
abe{ce,sa,,}da⊨ abeceda abesada abeda abeda
Podřetězce mohou být prázdné a mohou se opakovat; jejich zadané pořadí bude
při generování vždy dodrženo. Rovněž předpona a přípona generovaného parametru
mohou být prázdné, takže např. „""{,,}“ vygeneruje tři prázdné parametry.
Vyskytuje-li se v jednom parametru víc operátorů kartézského součinu,
zpracují se jako zleva doprava vnořené cykly, např. takto:
Uvnitř operátoru kartézského součinu můžete použít obvyklé způsoby odzvláštnění,
nejčastěji budete potřebovat potlačit zvláštní význam znaku „,“, který zde
normálně odděluje dosazované alternativy, a znaku mezera, který by jako
oddělovač parametrů celý operátor přerušil.
Práci s proměnnými (viz kapitolu Proměnné příkazy a interpretu)
Nastavení terminálu a výzvy (viz kapitolu Terminál)
Další poznámky:
Nastavení proměnné BASH_ENV umožňuje spustit „před-skript“ při spouštění skriptu.
1 Spuštění příkazu na pozadí nezmění „$?“ PID spuštěného procesu můžete přečíst ze zvláštní proměnné „$!“. Bezprostředně za znakem „&“ nesmí následovat další oddělovač příkazů jako „;“, „&&“ nebo „||“.
2 Příkaz „exec“ nelze použít s vestavěnými příkazy Bashe či s rourami.
3 Viz podrobnější vysvětlení v podsekci „Kartézský součin“.
4 Výchozí skok je 1, resp. -1; nové parametry se generují, dokud je vygenerovaná hodnota ≤ (pro záporný skok ≥) zadanému „limitu“. Pokud se počáteční hodnota a limit rovnají, výsledkem bude jedno číslo (tzn. jeden parametr).
5 Uvedené příkazy se spouštějí v podprostředí; návratová hodnota podprostředí je ignorována (neuloží se do $? a neovlivní proměnnou PIPESTATUS). Pozor: jakkoliv dlouhá sekvence znaků „\n“ na konci dosazovaného výstupu bude při dosazení vynechána!
6 Vzorkem se rozumí parametr, který obsahuje jako zvláštní znak „?“, „*“ nebo konstrukci „[]“ tvořící syntakticky platný vzorek bashe. Skryté soubory a adresáře jsou normálně ignorovány, pokud vzorek pro odpovídající část cesty nezačíná tečkou. Výsledný seznam parametrů se seřadí podle abecedy podle aktuální lokalizace.
7 Metapříkaz „!“ umí negovat návratový kód při ukládání do $?, viz kapitolu Metapříkazy.
8 Poznámka: jednoduchý příkaz toto pole přepíše jednoprvkovým polem; obsah pole PIPESTATUS není nikdy ovlivněn metapříkazem „!“.
9 Pozor, tato varianta vypisuje i jednotlivé příkazy vykonávané při dosazování operátorem $(), což může vyprodukovat velké množství rušivého výstupu.
10 Zvláštní položky „.“ a „..“ stále nebudou zahrnuty, pokud vzorek nezačíná tečkou.
11 Nedoporučuji používat nastavení „-u“ v interaktivním režimu, protože kód pro doplňování příkazové řádky obsahuje velké množství chyb v adresaci proměnných, a když na ně narazíte, příjdete o celou řádku, kterou jste se pokusil/a doplnit.
12 Poznámka: vypnutí těchto rozvojů nevypne nativní rozvoje specifické pro výzvu interpretu (tzn. např. za „\w“ se i nadále bude dosazovat aktuální adresář), ale nebudou se rozvíjet vnořené proměnné apod.
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.