Příkazy a operátory Bashe

Dokončeno

Každý jazyk prostředí má své nejčastěji používané příkazy. Pojďme se začít seznamovat s příkazy Bash od těch nejčastěji používaných.

Příkazy Bash

Pojďme se podívat na běžné příkazy Bash a jejich použití.

Příkaz ls

ls zobrazí obsah aktuálního adresáře nebo adresáře zadaného v argumentu příkazu. Sám o sobě vypíše soubory a adresáře v aktuálním adresáři:

ls

Soubory a adresáře, jejichž názvy začínají tečkou, jsou ve výchozím nastavení skryté. Pokud chcete tyto položky zahrnout do výpisu adresáře, použijte příznak -a:

ls -a

Pokud chcete o souborech a adresářích v aktuálním adresáři získat ještě další informace, použijte příznak -l:

ls -l

Toto je ukázkový výstup z adresáře, který obsahuje několik souborů JPEG a PNG a podadresář s názvem gifs:

-rw-rw-r-- 1 azureuser azureuser  473774 Jun 13 15:38 0001.png
-rw-rw-r-- 1 azureuser azureuser 1557965 Jun 13 14:43 0002.jpg
-rw-rw-r-- 1 azureuser azureuser  473774 Mar 26 09:21 0003.png
-rw-rw-r-- 1 azureuser azureuser 4193680 Jun 13 09:40 0004.jpg
-rw-rw-r-- 1 azureuser azureuser  423325 Jun 10 12:53 0005.jpg
-rw-rw-r-- 1 azureuser azureuser 2278001 Jun 12 04:21 0006.jpg
-rw-rw-r-- 1 azureuser azureuser 1220517 Jun 13 14:44 0007.jpg
drwxrwxr-x 2 azureuser azureuser    4096 Jun 13 20:16 gifs

Každý řádek poskytuje podrobné informace o odpovídajícím souboru nebo adresáři. Tyto informace zahrnují přiřazená oprávnění, vlastníka a velikost souboru v bajtech, čas poslední úpravy a název souboru nebo adresáře.

Příkaz cat

Předpokládejme, že chcete zjistit, co se nachází uvnitř souboru. K tomu můžete použít příkaz cat. Pokud se nejedná o textový soubor, nebude výstup dávat moc smysl. Následující příkaz zobrazí obsah souboru os-release uloženého v adresáři /etc:

cat /etc/os-release

Je to užitečný příkaz, protože vás informuje o tom, kterou distribuci systému Linux používáte:

NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

Adresář /etc je v Linuxu speciální. Obsahuje konfigurační soubory systému. Žádné soubory z tohoto adresáře nechcete odstranit, pokud si ovšem nejste jistí tím, co děláte.

Příkaz sudo

Některé příkazy Bash může spustit pouze uživatel root; správce systému nebo superuživatel. Pokud se pokusíte použít některý z těchto příkazů bez dostatečných oprávnění, dojde k chybě. Například příkaz cat k zobrazení obsahu /etc/at.deny můžou použít pouze uživatelé přihlášení jako superuživatelé:

cat /etc/at.deny

at.deny je speciální soubor, který určuje, kdo může použít další příkazy Bash k odeslání úloh pro pozdější spuštění.

Většinu času nechcete spustit jako kořen; Je to příliš nebezpečné. Pokud chcete spouštět příkazy, které vyžadují oprávnění správce bez přihlášení jako superuživatele, zobrazí se příkazy takto sudo:

sudo cat /etc/at.deny

sudo je zkratka pro "superuser do". Když ho použijete, říkáte prostředí, že pro tento příkaz fungujete s úrovní oprávnění root-user.

Příkazy cd, mkdir a rmdir

cd představuje zkratku pro „change directory“ (změnit adresář) a dělá přesně to, co jeho název napovídá, změní aktuální adresář na jiný adresář. Umožňuje přesun z jednoho adresáře do jiného, stejně jako jeho alternativa ve Windows. Následující příkaz přejde na podadresář aktuálního adresáře s názvem orders:

cd orders

Můžete se posunout o adresář nahoru zadáním .. jako názvu adresáře:

cd ..

Tento příkaz se změní do vašeho domovského adresáře; při prvním přihlášení:

cd ~

Pomocí příkazu mkdir můžete vytvářet adresáře. Následující příkaz vytvoří v aktuálním pracovním adresáři podadresář s názvem orders:

mkdir orders

Pokud chcete pomocí jednoho příkazu vytvořit podadresář a další podadresář, který je mu podřízený, použijte příznak --parents:

mkdir --parents orders/2019

Příkaz rmdir odstraní (odebere) adresář, ale jenom v případě, že je prázdný. Pokud není prázdný, zobrazí se místo toho upozornění. Naštěstí můžete pomocí rm příkazu odstranit adresáře, které nejsou prázdné v kombinaci s příznakem -r (rekurzivní). Příkaz by pak vypadal takto: rm -r.

Příkaz rm

Příkaz rm je zkratka pro odebrání. Jak byste očekávali, rm odstraní soubory. Tento příkaz tedy skoncuje se souborem 0001.jpg:

rm 0001.jpg

A tento příkaz odstraní všechny soubory v aktuálním adresáři:

rm *

Buďte při práci s příkazem rm opatrní. Je to nebezpečný příkaz.

Spuštění příkazu rm s příznakem -i vám dá před odstraněním možnost zamyslet se:

rm -i *

Snažte se zahrnout -i do každého příkazu rm a můžete se pak vyhnout tomu, že se stanete obětí jedné z největších chyb v Linuxu. Obávaný příkaz rm -rf / odstraní každý soubor na celé jednotce. Používá rekurzivní odstranění všech podadresářů kořenového adresáře a jejich podadresářů. Příznak -f (jako „force“ (vynutit)) problém ještě znásobí, protože potlačí výzvy. Nedělejte to.

Pokud chcete odstranit podadresář s názvem orders, který není prázdný, můžete použít příkaz rm tímto způsobem:

rm -r orders

Odstraní se tak podadresář orders a vše, co obsahuje, včetně dalších podadresářů.

Příkaz cp

Příkaz cp nekopíruje jen soubory, ale v případě potřeby i celé adresáře (a podadresáře). Pokud chcete vytvořit kopii souboru 0001.jpg s názvem 0002.jpg, použijte tento příkaz:

cp 0001.jpg 0002.jpg

Pokud soubor 0002.jpg již existuje, Bash ho tiše nahradí. Tento postup je skvělý, pokud jste to tak zamýšleli, ale pokud jste si neuvědomili, že přepíšete starou verzi, už tak skvělý není.

Pokud ale použijete příznak -i (jako „interactive“ (interaktivní)), Bash vás před odstraněním existujících souborů upozorní. Je to mnohem bezpečnější:

cp -i 0001.jpg 0002.jpg

Můžete samozřejmě použít zástupné znaky a zkopírovat několik souborů najednou. Pokud chcete zkopírovat všechny soubory v aktuálním adresáři do podadresáře s názvem photos, udělejte toto:

cp * photos

Pokud chcete zkopírovat všechny soubory v podadresáři s názvem photos do podadresáře s názvem images, udělejte toto:

cp photos/* images

Předpokládá se, že adresář images již existuje. Pokud neexistuje, můžete ho vytvořit a zkopírovat obsah adresáře photos pomocí tohoto příkazu:

cp -r photos images

Zkratka -r pro "rekurzivní". Další výhodou příznaku -r je, že pokud fotky obsahují vlastní podadresáře, zkopírují se také do adresáře obrázků .

Příkaz ps

Příkaz ps poskytuje snímek všech aktuálně spuštěných procesů. Sama o sobě, bez argumentů, zobrazuje všechny vaše procesy prostředí; Jinými slovy, ne moc. Pokud ale zadáte příznak -e, je to už o něčem jiném:

ps -e

-e zobrazí všechny spuštěné procesy, kterých obvykle bývá velké množství.

Komplexnější přehled o tom, jaké procesy v systému běží, získáte pomocí příznaku -ef:

ps -ef 

Tento příznak zobrazuje názvy všech spuštěných procesů, jejich identifikační čísla procesu (PID), PID nadřazených procesů (PPID) a čas jejich zahájení (STIME). Zobrazuje také, k jakému terminálu jsou připojeny (pokud jsou k nějakému připojeny) (TTY), kolik času procesoru si vyhradily (TIME) a jejich úplné názvy cest. Toto je zkrácený příklad:

UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 13:35 ?        00:00:03 /sbin/init
root          2      0  0 13:35 ?        00:00:00 [kthreadd]
root          3      2  0 13:35 ?        00:00:00 [rcu_gp]
root          4      2  0 13:35 ?        00:00:00 [rcu_par_gp]
root          5      2  0 13:35 ?        00:00:00 [kworker/0:0-cgr]
root          6      2  0 13:35 ?        00:00:00 [kworker/0:0H-kb]
root          8      2  0 13:35 ?        00:00:00 [mm_percpu_wq]
root          9      2  0 13:35 ?        00:00:01 [ksoftirqd/0]
root         10      2  0 13:35 ?        00:00:02 [rcu_sched]

Kromě toho můžete najít dokumentaci, která takové použití příkazups ukazuje:

ps aux

ps aux a ps -ef jsou stejné. Tuto dualitu můžeme vysledovat zpět k historickým rozdílům mezi systémy POSIX Unix (k nimž patří Linux) a systémy BSD Unix (z nichž nejběžnější je macOS). POSIX používal na začátku příznak -ef, zatímco BSD vyžadoval aux. V současné době přijímají obě řady operačních systémů oba formáty.

Toto je skvělé připomenutí, proč byste si měli pečlivě prozkoumat nápovědu všech příkazů Linuxu. Studium Bashe odpovídá studiu angličtiny jako druhého jazyka. Pravidla mají spoustu výjimek.

Příkaz w

Uživatelé přichází, uživatelé odchází a občas máte uživatele, o které vůbec nestojíte. Když zaměstnanec odejde hledat jiné příležitosti, musí správce systému zajistit, aby se tento pracovník už nemohl přihlásit do počítačového systému společnosti. Očekává se také, že správci systému vědí, kdo je přihlášený a kdo by neměl být.

Linux má příkaz w (jako „who“ (kdo)), který zjistí, kdo se nachází na vašich serverech. Zobrazuje informace o uživatelích, kteří se aktuálně nacházejí v počítačových systémech, a činnostech těchto uživatelů. w zobrazuje uživatelská jména a jejich IP adresy, kdy se přihlásili, jejich aktuálně spuštěné procesy a kolik času tyto procesy spotřebovávají. Jedná o cenný nástroj správců systému.

Vstupně-výstupní operátory Bashe

Spouštěním příkazů Bash a jejich různých možností toho v Linuxu zvládnete opravdu hodně. Všechnu práci ale můžete udělat, když příkazy zkombinujete pomocí vstupně-výstupních operátorů:

  • < pro přesměrování vstupu na jiný zdroj než klávesnici
  • > pro přesměrování výstupu na jiný cíl než obrazovku
  • >> pro stejný postup, místo přepsání se ale provede připojení
  • | pro předání výstupu z jednoho příkazu do vstupu jiného příkazu

Předpokládejme, že chcete zobrazit seznam všech položek v aktuálním adresáři a zachytit výstup v souboru s názvem listing.txt. Přesně to udělá následující příkaz:

ls > listing.txt

Pokud už soubor listing.txt existuje, přepíše se. Pokud místo toho použijete operátor >>, přidá se výstup z příkazu ls k obsahu souboru listing.txt:

ls >> listing.txt

Operátor propojení je velmi účinný (a často se používá). Přesměruje výstup prvního příkazu do vstupu druhého příkazu. Řekněme, že příkaz cat použijete k zobrazení obsahu velkého souboru, ale obsah se posouvá příliš rychle, abyste si ho mohli přečíst. Výstup můžete lépe ovládat, pokud výsledky propojíte s jiným příkazem, například more. Následující příkaz zobrazí seznam všech aktuálně spuštěných procesů. Jakmile se obrazovka zaplní, výstup se pozastaví, dokud nestisknete ENTER k zobrazení dalšího řádku:

ps -ef | more

Výstup můžete také propojit s head, aby se zobrazilo jenom několik prvních řádků:

ps -ef | head

Nebo předpokládejme, že chcete filtrovat výstup tak, aby obsahoval pouze řádky, které obsahují slovo démon. Jedním ze způsobů, jak to udělat, je propojení výstupu z ps užitečného grep nástroje linuxu:

ps -ef | grep daemon

Výstup by mohl vypadat takto:

azureus+  52463  50702  0 23:28 pts/0    00:00:00 grep --color=auto deamon
azureuser@bash-vm:~$ ps -ef | grep daemon
root        449      1  0 13:35 ?        00:00:17 /usr/lib/linux-tools/4.18.0-1018-azure/hv_kvp_daemon -n
root        988      1  0 13:35 ?        00:00:00 /usr/lib/accountsservice/accounts-daemon
message+   1002      1  0 13:35 ?        00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
daemon     1035      1  0 13:35 ?        00:00:00 /usr/sbin/atd -f
root       1037      1  0 13:35 ?        00:00:00 /usr/bin/python3 -u /usr/sbin/waagent -daemon
root       1039      1  0 13:35 ?        00:00:00 /usr/lib/linux-tools/4.18.0-1018-azure/hv_vss_daemon -n
azureus+  52477  50702  0 23:28 pts/0    00:00:00 grep --color=auto daemon

Jako vstup můžete použít také soubory. Ve výchozím nastavení pochází standardní vstup z klávesnice, je možné ho ale také přesměrovat. Pokud chcete získat vstup ze souboru místo z klávesnice, použijte operátor <. Jedním z běžných úkolů správce systému je seřadit obsah souboru. Jak název napovídá, příkaz sort řadí text v abecedním pořadí:

sort < file.txt

Pokud chcete seřazené výsledky uložit do nového souboru, můžete přesměrovat vstup a výstup:

sort < file.txt > sorted_file.txt

Podle potřeby můžete použít vstupně-výstupní operátory ke zřetězení příkazů Linuxu. Zvažte použití následujícího příkazu:

cat file.txt | fmt | pr | lpr

Výstup z příkazu cat přejde do příkazu fmt, výstup z příkazu fmt přejde do příkazu pr a tak dále. Příkaz fmt formátuje výsledky do úhledného odstavce. Příkaz pr výsledky stránkuje. A příkaz lpr odesílá stránkovaný výstup do tiskárny. To všechno na jednom řádku.