Ovládání prostředí Bash v systémech Linux, macOS či jiných systémech typu UNIX vyžaduje znalost specifických znaků, jako jsou ~, *, | a >. Tento článek vám pomůže rozklíčovat tyto tajemné sekvence příkazů a stát se mistrem v dešifrování linuxových příkazů.
Co jsou speciální znaky?
V Bash shell existuje sada znaků, které se interpretují dvěma různými způsoby. Když je zadáte do shellu, fungují jako instrukce, příkazy, které shellu udávají, co má vykonat. Můžeme si je představit jako jednoznakové povely.
Občas však chceme znak pouze vytisknout, aniž by fungoval jako speciální symbol. Existuje způsob, jak docílit toho, aby znak reprezentoval sám sebe, a nikoli svou speciální funkci.
V následujícím textu si ukážeme, které znaky jsou považovány za „speciální“ či „meta“ znaky a jak je můžete používat funkčně i doslovně.
~ Domovský adresář
Vlnovka (~) je zástupný symbol pro váš domovský adresář. To znamená, že nemusíte v příkazech vypisovat celou cestu k vašemu domovskému adresáři. Ať jste v souborovém systému kdekoli, můžete se pomocí tohoto příkazu přesunout do vašeho domovského adresáře:
cd ~
Tento symbol můžete také použít s relativními cestami. Pokud se například nacházíte v systému souborů mimo vaši domovskou složku a chcete se přesunout do adresáře „archive“ ve složce „work“ ve vašem domovském adresáři, použijte k tomu vlnovku:
cd ~/work/archive
. Aktuální adresář
Tečka (.) reprezentuje aktuální adresář. Uvidíte ji ve výpisech adresářů, pokud použijete volbu -a (all) s příkazem ls.
ls -a
Tečku můžete v příkazech použít také pro reprezentaci cesty k vašemu aktuálnímu adresáři. Pokud například chcete spustit skript z aktuálního adresáře, zavoláte ho takto:
./script.sh
Tím příkazu Bash řeknete, aby hledal soubor script.sh v aktuálním adresáři. Vyhnete se tak prohledávání adresářů v definované cestě pro spustitelný soubor nebo skript.
.. Nadřazený adresář
Dvojitá tečka (..) představuje nadřazený adresář vašeho aktuálního adresáře. Můžete ji použít k posunutí o jednu úroveň výše ve stromu adresářů.
cd ..
Tento příkaz můžete použít i s relativními cestami – například pokud se chcete přesunout o úroveň výše ve stromu adresářů a poté vstoupit do jiného adresáře na dané úrovni.
Tuto techniku můžete využít i pro rychlý přesun do adresáře, který je na stejné úrovni ve stromu adresářů jako váš aktuální. Nejprve se přesunete o úroveň výš a pak se vrátíte o jednu úroveň zpět do jiného adresáře.
cd ../gc_help
/ Oddělovač cesty k adresáři
Pro oddělení adresářů v názvu cesty můžete použít lomítko (/).
ls ~/work/archive
Jedno lomítko reprezentuje nejkratší možnou cestu k adresáři. Protože vše ve stromu adresářů Linux začíná v kořenovém adresáři, můžete tento příkaz použít pro rychlý přesun do kořenového adresáře:
cd /
# Komentář nebo oříznutí řetězce
Znak hash (#) se obvykle používá k označení komentáře pro shell. Co následuje za tímto znakem, shell ignoruje. Můžete ho použít ve skriptech shellu a také (méně užitečně) na příkazovém řádku.
# This will be ignored by the Bash shell
Nicméně, ve skutečnosti není úplně ignorován, protože se uloží do vaší historie příkazů.
Znak hash lze také použít k oříznutí proměnné řetězce a odstranění textu ze začátku. V následujícím příkladu vytvoříme řetězcovou proměnnou s názvem this_string.
Do proměnné přiřadíme text „Dave Geek!“.
this_string="Dave Geek!"
Tento příkaz použije echo pro vypsání slov „How-To“ do okna terminálu. Načte hodnotu uloženou v řetězcové proměnné pomocí rozšíření parametrů. Protože přidáme znak hash a text „Dave“, tato část řetězce se ořízne předtím, než se předá do echo.
echo How-To ${this_string#Dave}
Hodnota uložená v řetězcové proměnné se tím nezmění. Ovlivňuje to pouze to, co se odešle do echo. Pomocí echo můžeme znovu vytisknout hodnotu řetězcové proměnné a ověřit si to:
echo $this_string
? Zástupný znak pro jeden znak
Bash shell podporuje tři zástupné znaky, jedním z nich je otazník (?). Zástupné znaky se používají k nahrazení znaků v šablonách názvů souborů. Název souboru se zástupným znakem je šablonou, která odpovídá sadě názvů souborů, nikoli pouze jednomu.
Zástupný znak otazník reprezentuje právě jeden znak. Vezměme v úvahu následující šablonu názvu souboru:
ls badge?.txt
Tento příkaz znamená „vypiš jakýkoli soubor s názvem, který začíná na ‚badge‘ a za nímž následuje jakýkoli jeden znak před příponou souboru“.
Příkaz bude odpovídat následujícím souborům. Můžete si všimnout, že některé mají čísla a některé písmena za částí názvu souboru „badge“. Zástupný znak otazník bude odpovídat písmenům i číslům.
Šablona názvu souboru ale neodpovídá „badge.txt“, protože v názvu souboru mezi „badge“ a příponou souboru není žádný znak. Zástupný znak otazník se musí shodovat s existujícím znakem v názvu souboru.
Otazník můžete použít také k vyhledání všech souborů s určitým počtem znaků v názvu. V následujícím příkladu se zobrazí všechny textové soubory, které mají v názvu souboru přesně pět znaků:
ls ?????.txt
* Zástupný znak pro sekvenci znaků
Můžete použít hvězdičku
ls badge*
jako zástupný znak pro libovolnou sekvenci znaků, včetně žádných znaků. Vezměme si následující šablonu názvu souboru:
Odpovídá „badge.txt“, protože zástupný znak představuje libovolnou sekvenci znaků nebo žádné znaky.
ls source.*
[] Zástupný znak pro sadu znaků
Jak jsme zmínili, otazník slouží k reprezentaci jednoho znaku, hvězdička k reprezentaci libovolné sekvence znaků (včetně žádných znaků). Zástupný znak [] lze vytvořit pomocí hranatých závorek ([]) a znaků, které obsahují. Odpovídající znak v názvu souboru se musí shodovat alespoň s jedním ze znaků v dané sadě zástupných znaků.
ls badge_0[246].txt
Můžete použít více než jednu sadu závorek pro každou šablonu názvu souboru:
ls badge_[01][789].txt
Do sady znaků můžete také zahrnout rozsahy. Následující příkaz vybere soubory s čísly 21 až 25 a 31 až 35 v názvu souboru.
ls badge_[23][1-5].txt
; Oddělovač příkazů shellu
ls > count.txt; wc -l count.txt; rm count.txt
Důležité je, že druhý příkaz se provede, i když první selže, třetí se provede i v případě, že selže druhý, a tak dále.
cd ./doesntexist && cp ~/Documents/reports/* .
& Proces na pozadí
Po zadání příkazu v okně terminálu a jeho dokončení se vrátíte na příkazový řádek. Obvykle to trvá jen chvíli nebo dvě. Pokud ale spustíte jinou aplikaci, například gedit, nemůžete používat okno terminálu, dokud aplikaci nezavřete.
gedit command_address.page &
Bash vám ukáže ID procesu toho, co bylo spuštěno, a poté vás vrátí na příkazový řádek. Poté můžete pokračovat v používání okna terminálu.
< Přesměrování vstupu
Mnoho příkazů Linuxu přijímá soubor jako parametr a z tohoto souboru čerpá data. Většina těchto příkazů může také přijímat vstup ze streamu. Pro vytvoření streamu použijte levou lomenou závorku (<).
sort < words.txt
Pokud má příkaz přesměrovaný vstup, může se chovat odlišně, než když čte z pojmenovaného souboru.
Pokud použijeme wc k spočítání slov, řádků a znaků v souboru, vytiskne hodnoty a poté název souboru. Pokud přesměrujeme obsah souboru do wc, vytiskne stejné číselné hodnoty, ale neví název souboru, ze kterého data pocházejí. Nemůže tedy vypsat název souboru.
Zde je několik příkladů použití příkazu wc:
wc words.txt
wc < words.txt
> Přesměrování výstupu
Pravou lomenou závorku (>) můžete použít k přesměrování výstupu z příkazu (obvykle do souboru). Zde je příklad:
ls > files.txt
cat files.txt
wc doesntexist.txt 2> errors.txt
cat errors.txt
| Roura
„Roura“ propojuje příkazy dohromady. Bere výstup jednoho příkazu a předává ho dalšímu jako vstup. Počet příkazů (délka řetězce) je libovolná.
V následujícím příkladu použijeme cat pro vložení obsahu souboru words.txt do grep, který extrahuje každý řádek, který obsahuje malé nebo velké „C“. grep pak tyto řádky předá příkazu sort. sort používá volbu -r (obrátit), takže seřazené výsledky se zobrazí v obráceném pořadí.
cat words.txt | grep [cC] | sort -r
! Logické NOT a operátor historie
Vykřičník (!) je logický operátor, který znamená NE.
[ ! -d ./backup ] && mkdir ./backup
V tomto příkazovém řádku jsou dva příkazy: první příkaz je text v hranatých závorkách; druhý příkaz je text, který následuje za dvojitým ampersandem &&.
První příkaz používá ! jako logický operátor. Hranaté závorky označují, že se provede test. Volba -d (adresář) testuje přítomnost adresáře s názvem „backup“. Druhý příkaz vytvoří adresář.
Protože dvojité ampersandy oddělují dva příkazy, Bash provede druhý pouze v případě, že první uspěje. To je však opak toho, co potřebujeme. Pokud je test adresáře „backup“ úspěšný, nemusíme jej vytvářet. A pokud test „backup“ selže, druhý příkaz se neprovede a chybějící adresář se nevytvoří.
V tuto chvíli logický operátor ! působí jako logické NE. Pokud je tedy test úspěšný (tj. adresář existuje), ! to změní na „NE úspěch“, což je neúspěch. Proto se druhý příkaz neaktivuje.
Pokud test adresáře selže (tj. adresář neexistuje), ! změní odpověď na „NE selhání“, což je úspěch. Spustí se tedy příkaz k vytvoření chybějícího adresáře.
Tento malý ! má velký význam, když ho potřebujete!
ls -l -d backup
!24
!!
Následující příkaz znovu spustí předchozí příkaz:
$ Proměnné výrazy
V prostředí Bash vytváříte proměnné pro ukládání hodnot. Některé, jako proměnné prostředí, vždy existují a máte k nim přístup kdykoli otevřete okno terminálu. Tyto proměnné obsahují hodnoty jako vaše uživatelské jméno, domovský adresář a cestu.
echo $USER
echo $HOME
echo $PATH
Níže vidíte příklady, jak vytvořit vlastní proměnné:
ThisDistro=Ubuntu
MyNumber=2001
echo $ThisDistro
echo $MyNumber
Přidejte složené závorky ( {}) kolem znaku dolaru a proveďte rozšíření parametru, abyste získali hodnotu proměnné a umožnili další transformace hodnoty.
MyString=123456qwerty
Tím se vytvoří proměnná, která obsahuje řetězec znaků, jak je znázorněno níže:
echo ${MyString}
Pro odeslání řetězce do okna terminálu použijte následující příkaz:
echo ${myString:6}
Chcete-li vrátit podřetězec začínající na pozici 6 celého řetězce, použijte následující příkaz (je zde nulový posun, takže první pozice je nula):
echo ${myString:0:6}
Pokud chcete do echo odeslat podřetězec, který začíná na pozici nula a obsahuje dalších šest znaků, použijte následující příkaz:
echo ${myString:4:4}
<img loading=“lazy“ decoding=“async“ src=“https://etechblog.cz/wp-content/uploads/2021/12/1640151510_