3. Příkazová řádka

Autor sekce: Jiří Sedláček <sedlacek@vse.cz>

3.1. Efektivnější a pohodlnější práce na příkazové řádce

Existuje řada klávesových zkratek a dalších postupů pro efektivnější, rychlejší a pohodlnější práci na příkazové řádce. Neuvádím všechny možnosti.

Klávesa(y)

Význam/využití

a

Listování posledně zadanými příkazy nahoru (starší příkazy) / dolů

a

Pohyb v rámci aktuálního příkazu

Home End

Obvyklý význam (na začátek/konec řádku)

Backspace Del

Vymaže znak jako obvykle („před sebe“, „za sebe“)

Ctrl + W

Vymaže slovo (Word): slovo končí mezerou (ev. tabulátorem)

Ctrl + U

Vymaže celý řádek

Tab

Dokončování příkazů (viz poznámka 2)

Ctrl + R

Reverse search: stiskněte tuto zkratku a potom zadejte několik znaků kdekoli z příkazů (ze začátku, uprostřed, na konci), pokud možno co nejvíce unikátní. Zobrazí se první vyhovující příkaz. Poté můžete:

  1. použít tento příkaz (šipkou vlevo/vpravo) a příp. ho upravit

  2. připsat další písmeno/písmena

  3. znovu (opakovaně) stisknout Ctrl + R a zobrazí se další vyhovující příkaz

Ctrl + C

Přeruší vykonávání daného programu (pošle mu signál přerušení). Existují však určité výjimky: některé programy se ukončí klávesou q (Quit) nebo příkazem exit.

Příkaz

Význam/využití

history

Zobrazí n posledních příkazů (např. 100, záleží na nastavení) Řádky jsou očíslovány což lze využít různými kombinacemi „!“.

history 25

Vypíše 25 posledních příkazů

!!
!nnn
!-8
Zopakuje poslední příkaz
Zopakuje příkaz z řádky daného čísla (číslo bez mezery)
Aktuální příkaz mínus 8

clear

Příkaz smaže obsah obrazovky terminálu (jen obrazovku, nemá žádný vliv na historii).

reset

Resetuje nastavení terminálů (použijte, když clear nestačilo) např. poté, co jste na terminál omylem vypsali obsah binárního souboru.

Poznámky:

  1. Některé klávesy nemusí na vašem PC fungovat tak, jak výše popsáno (závisí na typu klávesnice, nastavení terminálu, zda jde o virtuální nebo „pravý“ textový terminál).

  2. Dokončování příkazů (klávesa Tab) funguje nejen pro příkazy, ale i jejich přepínače a parametry (např. jména souborů). Zapište několik písmen a stiskněte Tab. Je-li jednoznačné, doplní např. celý zbytek jména souboru. Pokud není jednoznačné, ale možností je jen několik, vypíše je. Je-li jich hodně, zeptá se, zda je má všechny vypsat.

Je-li shell Bash (nejčastější), je historie příkazů uložena v souboru .bash_history, ten si můžete např. zkopírovat na své PC a prohlédnout (po dosažení maximálního počtu řádků jsou nejstarší mazány).

3.2. Interpret příkazů (shell)

Vámi zadané příkazy zpracovává tzv. interpret příkazů (příkazový interpret, též příkazový procesor, anglicky shell). Shell je automaticky spuštěn po přihlášení uživatele do systému, vytváří tzv. příkazovou řádku, pomocí které může uživatel počítač ovládat.

Shell má dva základní režimy:

  1. Interaktivní režim: vložený příkaz nebo příkazy jsou ihned zpracovány po odeslání klávesou Enter. Typicky jsou příkazy na jednom řádku, ale i v interaktivním režimu lze (dlouhé) příkazy zapsat na více řádků. Na konec řádku zapište \ (zpětné lomítko), na dalším řádku se objeví znak > a můžete pokračovat v psaní příkazů. Rozlišujte různé využití zpětného lomítka (viz přehled níže).

  2. Dávkový režim: provádí příkazy předem zapsané v textovém souboru. V Unixu a Linuxu jim zpravidla říkáme skripty (případně shellové skripty). Může jít o značně komplexní programy. K dispozici jsou mimo jiné logické operátory, podmíněné příkazy či příkazy iterace. Skripty se zde nebudeme blíže zabývat.

Jaký konkrétní shell se po přihlášení daného uživatele automaticky spustí, je uvedeno v souboru /etc/passwd (viz ukázka výpisu tohoto souboru v prezentaci). Ve většině Linux distribucí je to nejčastěji /bin/bash, bash (Bourne-again shell), který vychází ze staršího Bourne shell. Některé další shelly jsou (v konkrétní distribuci nejsou k dispozici všechny):

  • ash, dash: Almquist shell (ash) je malý, kompaktní a tedy rychlý shell s určitými omezeními. Dash je jeho verze pro Debian, kde se používá pro rychlejší start počítače, pro uživatele je pak zpravidla nastaven výše popsaný bash. Dále se hodně používá u zařízení s embedded Linux (např. domácí multimediální centra, set-top boxy a další spotřební elektronika, různá síťová zařízení) a u některých Linux mini distribucí.

  • rbash: Restricted shell záměrně omezuje možnosti v něm prováděných interaktivních nebo dávkových příkazů s cílem zvýšit zabezpečení systému (některým útokům však nemůže zabránit, existují také triky na únik z omezeného režimu). V případě shellu bash se vyvolá příkazem rbash nebo bash -r.

Prompt se zobrazuje na začátku příkazové řádky. V nejjednodušším případě se může zobrazovat pouze jako znak $, příp. jako > u některých shellů. Často zde bývá např. jméno uživatele a/nebo aktuální adresář, příp. i další údaje, někdy i barevně rozlišené. Na případnou úpravu (dočasnou, trvalou) existuje na Internetu řada návodů.

Pokud zadáte určitý příkaz (příkazy) interpret příkazů provede nejprve řadu transformací např. nahradí * nebo ? odpovídajícím seznamem souborů, obdobně nahrazuje proměnné jejich obsahem ad. Poté:

  1. Interní příkaz: pokud příkaz, který jste zadali je tzv. interní příkaz (bultin command), vykoná ho interpret příkazů.

  2. Externí příkaz: pokud to není interní příkaz, tak interpret příkazů najde odpovídající program (spustitelný soubor), spustí ho a předá mu všechny argumenty.

Interních příkazů je poměrně málo, např. alias, cd, echo, exit, logout, pwd.

Zda jde o interní příkaz lze zjistit interním příkazem type, např. type cd (vypíše cd is a shell builtin = interní příkaz) nebo type cat, který vypíše cat is hashed (/bin/cat) = externí příkaz. Někdy type vypíše, že je to alias, např. grep is aliased to `grep –color=auto‘. U aliasu snadno nepoznáte, zda výsledný příkaz je interní/externí: nejspíše ale externí, protože pro interní příkazy se aliasy obvykle nevytváří. Poslední možnost je … shell keyword např. pro příkazy jako if, for, time které se používají ve skriptech = také interní.

Z hlediska běžného uživatele není až tak důležité, zda jde o interní nebo externí příkaz.

3.3. Různé využití zpětného lomítka

Znak \ (zpětné lomítko) má v Linuxu nejméně tři různé významy, podle toho, kde ho použijete:

  1. Znak následující za zpětným lomítkem bude interpretován jako obyčejný znak, i když jinak má speciální význam: př. \? nebo \* nebo \ (viz kap. „Obvykle použití speciálních znaků“ výše).

  2. Znak \ na konci řádku = pokračování příkazu na další řádce

  3. Třetí, dosud neprobraný, způsob využití znaku \ je, že uvozuje tzv. formátovací nebo řídící znak. Nejčastěji (např. v dále popsaném příkazu echo) využijete \n, což znamená nový řádek (newline).

Další řídící nebo formátovací znaky pravděpodobně využijete až ve skriptech, např. \t znamená tabulátor, \f je FormFeed (nová stránka), \a je alert bell (zvukové znamení).

3.4. Příkazy - argumenty, přepínače a parametry

Můžeme zadávat příkazy bez dalších argumentů např.

pwd
ls

či za příkazem může následovat jeden či více argumentů, např.

mkdir prac
cd prac
ls -l
cd ..
cp soub.txt prac
mv --force soub.txt prejmen.txt
ls -l -a a*
pwd (print working directory) vypíše aktivní adresář (užitečné, pokud se aktuální adresář nezobrazuje jako součást promptu).
ls (list) bez argumentů vypíše jen jména souborů v aktuálním adresáři.
mkdir (make directory) vytvoří nový adresář prac,
cd (change directory) je změna aktuálního adresáře ve do prac,
cp (copy) zde zkopíruje soub.txt do adresáře prac (pokud adresář neexistuje, tak vytvoří soubor prac).
mv (move) přesouvá nebo přejmenovává soubor/soubory (zde přejmenování).

Podrobnější popis těchto příkazů je v kapitole Tematický přehledu vybraných příkazů.

Již z těchto ukázek je vidět, že v Unixu lze argumenty rozdělit do několika skupin:

  • přepínače (options, ze slova optional) začínají jednou pomlčkou (krátký přepínač) či dvěma pomlčkami (dlouhý přepínač). Přepínač může mít argument (hodnotu) či je bez hodnoty a přepíná mezi dvěmi logickými hodnotami (v angličtině se poté často označuje jako flag).

  • krátký přepínač (short option) začíná jednou pomlčkou. Je snaha volit tyto přepínače mnemotechnicky (např. -l jako long), ale příkazů i přepínačů je mnoh a stejné písmeno mívá u různých příkazů různý význam. Je-li těchto přepínačů více, může být každý zapsán samostatně, ale typicky se sdružují (na pořadí zpravidla nezáleží). Příklady pro ls:

ls -l       # dlouhý (long) výpis
ls -l -a    # long formát, navíc vypsat i skryté soubory
ls -la      # totéž jako -l -a
  • dlouhý přepínač (long option) začíná dvěma pomlčkami následované celým slovem (i více slov bez mezer spojených pomlčkou). Ke krátkému přepínači obvykle existuje i dlouhá varianta (jednou z výjimek bez dlouhé varianty je ls -l), dlouhých přepínačů je obvykle více než krátkých.

ls --all       # --all je stejné jako -a
ls --directory # stejné jako ls -d, vypíše se jméno adresáře, ne obsah
ls -l --all    # stejné jako ls -la
  • flag - všechny dosavadní ukázky byly se přepínači bez zadané hodnoty. Tyto přepínače buď jsou či nejsou uvedeny - přepínají mezi dvěmi logickými hodnotami. V češtině se obvykle pro ně nepoužívá speciální pojmenování.

  • přepínače s hodnotou - někdy je nutné či vhodné nastavit i konkrétní hodnotu přepínače. Hodnoty jsou častějí u dlouhých přepínačů. Následují ukázky:

ls -l --sort=size        # long formát, setřídit dle velikosti
ls -l --sort=time        # long formát, setřídit dle času
ls -l --sort time        # stejné jako předchozí, hodnota oddělená mezerou
ls -l --sort=extension   # long formát, setřídit dle přípony
  • parametry obvykle určují, s čím má příkaz či program pracovat. Např. v příkazu mkdir se zadá jméno adresáře, který se má vytvořit. Lze zadat více adresářů a poté se vytvoří všechny. Příkaz pwd je představitelem příkazů bez parametrů. Příkaz ls lze použít bez parametrů (vypíší se všechny soubory v aktuálním adresáři) či lze zadat adresář(e), ze kterých se mají vypisovat soubory či lze zadat vzor(y) názvů souborů, které se mají vypsat:

ls                     # bez parametrů, vypíše se obsah aktuálního adresáře
ls -l prac             # vypsání souborů v adresáři "prac"
ls -l c* b*            # vypíší se soubory/adresáře začínající písmeny c a b
  • poziční parametry - u příkazů jako cp nebo mv standardně zadáváte dva parametry (co kam zkopírovat resp. co přejmenovat na co). U těchto parametrů závisí na pořadí, na vzájemné pozici vůči sobě.

cp soub.txt prac               # zkopírování souboru do podadresáře prac
mv --force soub.txt prejmen.txt    # přejmenování souboru

Závěr: počet a význam nutných argumentů lze většinou odvodit z funkce daného příkazu.

3.5. Nápověda k příkazům

Zatímco základní parametry příkazů si většinou odvodíte z funkce daného příkazu, přepínače příkazu si pravděpodobně budete pamatovat jen vybrané a pro nejpoužívanější příkazy. Proto je důležité naučit se používat různé formy nápovědy:

  1. Interní nápověda daného příkazu (programu).

  2. Dokumentace ve formě manuálových stránek.

  3. Dokumentace ve formě pro program info.

  4. Online verze manuálových stránek.

  5. Online stránky s příklady, FAQ, HOWTO stránky, další WWW stránky.

Interní nápověda pro daný příkaz závisí na tom, zde jde o interní nebo externí příkaz.

  1. pro většinu externích příkazů funguje příkaz --help, např. ls --help. Funguje i u některých interních příkazů.

  2. pro interní příkazy zadejte help interní_příkaz, např. help cd.

Pokud nevíte, zkuste nejprve (a) a pak teprve (b).

Již nápověda –help je obvykle dost podrobná, další možností jsou manuálové stránky, ty vyvoláte man příkaz, např. man ls. Příkaz man nápovědu automaticky stránkuje. Manuálové stránky jsou standardně rozděleny do více kategorií:

1 Executable programs or shell commands
2 System calls (functions provided by the kernel)
3 Library calls (functions within program libraries)
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd
6 Games
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
8 System administration commands (usually only for root)
9 Kernel routines [Non standard]

Příkaz man passwd zobrazí nápovědu pro příkaz passwd. Příkaz man 5 passwd zobrazí nápovědu pro soubor /etc/passwd.

Příkaz man man zobrazí nápovědu programu man a také přehled 10 kategorií. Při hledání nápovědy k nějakému tématu zkuste zadat přepínač -f či -k, viz následující ukázky:

man -k passwd
passwd (5)           - the password file
passwd (1)           - change user password
passwd (1ssl)        - compute password hashes
man -k passwd
chgpasswd (8)        - update group passwords in batch mode
chpasswd (8)         - update passwords in batch mode
gpasswd (1)          - administer /etc/group and /etc/gshadow
grub-mkpasswd-pbkdf2 (1) - generate hashed password for GRUB
htpasswd (1)         - Manage user files for basic authentication
ldappasswd (1)       - change the password of an LDAP entry
mkpasswd (1)         - Overfeatured front end to crypt(3)
pam_localuser (8)    - require users to be listed in /etc/passwd
passwd (1)           - change user password
passwd (1ssl)        - compute password hashes
passwd (5)           - the password file
slapd-passwd (5)     - /etc/passwd backend to slapd
slappasswd (8)       - OpenLDAP password utility
update-passwd (8)    - safely update /etc/passwd, /etc/shadow and /etc/group

Další program info zobrazí pro konkrétní příkaz nebo téma někdy stejné informace (ale trochu jinak naformátované), někdy ještě podrobnější. Existuje též podobný program pinfo (může být třeba doinstalovat), který je pro řadu uživatelů přehlednější (vybrané části dokumentace, např. odkazy na WWW stránky, odkazy na další témata, jsou zvýrazněny barevně).

Online verze manuálových stránek: obdobně jako u pinfo, řada uživatelů preferuje online verzi manuálových stránek jako přehlednější (zvýraznění tučně a jinou barvou). Mezi další výhody patří, že takto můžete prostudovat i nápovědu pro příkazy, které dosud nemáte instalovány, příp. porovnat nápovědu i pro různé verze. Např. pro Debian jsou oficiální man stránky na:

Nápověda s příklady: než oficiální „suchá“ dokumentace je pro začátečníky, ale někdy i pro zkušenější uživatele, srozumitelnější nápověda příkazu s příklady. Zadejte do vyhledávače „příkaz examples“, příp. „Linux příkaz examples“, např. cat examples a měli byste získat hned několik kvalitních odkazů na články a tutoriály, které použití příkazu ilustrují na názorných příkladech.

Dále existuje řada stránek s častými otázkami (FAQ), tzv. HOWTO stránky, Wiki stránky a mnoho dalších WWW stránek věnovaných Linux příkazům a Linuxu obecně.

3.6. Obecná struktura nápovědy pro příkazy

Ať už jste nápovědu pro daný příkaz získaly přepínačem –help, programem man nebo info, je struktura nápovědy velmi podobná. Na začátku bývá obecný formát příkazu, poté význam jednotlivých parametrů a přepínačů a příp. další důležité informace. Např. pro příkaz ls

ls [OPTION]... [FILE]...

je jak „Option“, tak „File“ v hranatých závorkách, tzn. že obě tyto části lze vynechat, jak už jsme uvedli v příkladech dříve. Je tedy možné zadat:

ls

uvedeme jen samotný příkaz

ls -la

uvedeme jen jeden nebo více přepínačů

ls prac

žádný přepínač, jeden parametr - soubor nebo adresář

ls -la prac

použity dva přepínače a jeden parametr (soubor nebo adresář)

Naproti tomu pro příkaz mkdir je obecný formát příkazu poněkud jiný:

mkdir [OPTION]... DIRECTORY...

Důvod je zřejmý: zatímco přepínače jsou volitelné, jméno nejméně jednoho vytvářeného adresáře je nutné vždy zadat, jinak příkaz mkdir nedává smysl.

U příkazu mv jsou uvedena hned tři obecná schémata, jak příkaz použít, protože příkazem lze soubory přejmenovávat i přesouvat (schémata si již prostudujte samostatně).

mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...

U jiných příkazů se můžeme setkat ještě s dalšími variantami obecného formátu příkazu, např. u příkazu hostname jedna varianta pro zobrazení jména PC má tento tvar:

hostname [-a|-A|-d|-f|-i|-I|-s|-y]

Všechny přepínače jsou v hranatých závorkách, tj. lze je vynechat. Ale v rámci hranatých závorek jsou jednotlivé volby odděleny svislou čarou, tzn. že se vzájemně vylučují: můžete si vybrat jen jednu možnost. V druhé variantě (pro nastavení jména PC) má obecný formát příkazu následující tvar:

hostname [-b] {hostname|-F file}

První přepínač je jako obvykle v hranatých závorkách, lze ho tedy vynechat, celý zbytek je ve složených závorkách a opět je zde svislá čára. To znamená, že tyto dvě volby se opět vzájemně vylučují, ale jednu možnost si musíte vybrat.

3.7. Proměnné v shellu, proměnné prostředí

Příkazový interpret používá proměnné (shell variables). Každá proměnná má jméno a hodnotu, hodnotou může být i prázdný řetězec. Po přihlášení a spuštění příkazového interpretu se jich vytvoří poměrně hodně. Všechny proměnné prostředí vypíšete příkazem set. Tabulka uvádí význam několika důležitých proměnných (zda je určitá proměnná nastavena závisí též na distribuci, příp. použitém shellu, např. EDITOR, PAGER, TZ).

Proměnná

Stručný popis

USER

uživatelské jméno právě přihlášeného uživatele (např. novak)

HOME

domovská složka aktuálního uživatele (absolutní cesta: /home/novak)

HOSTNAME

jméno počítače

SHELL

který shell je právě aktivní (např. /bin/bash)

TERM

který terminál je aktivní (např. xterm)

PWD

aktuální adresář

OLDPWD

předchozí adresář (proměnná na začátku prázdná)

LANG

nastavení jazyka (kód jazyka a kódování)

PS1, PS2

Prompt String1 a 2: aktuální nastavení tzv. promptu

PATH

vyhledávací cesta (podrobnosti pod tabulkou)

Při použití se před jméno doplní znak $ (dolar), popř. lze ještě jméno uzavřít do složených závorek. Obsah (hodnotu) proměnné vypíšeme příkazem echo $JMÉNO, např. echo $PWD (je to totéž jako příkaz pwd).

echo $PATH vypíše seznam složek oddělených dvojtečkou, např. /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin. V těchto složkách bude interpret příkazů vyhledávat programy. Pokud není v žádném z těchto adresářů, vypíše chybovou hlášku. Hodnota se do proměnné přiřazuje pomocí operátoru = (rovná se). Okolo operátoru nesmí být mezery. Např. další adresář přidáme do cesty takto:

PATH=$PATH:/home/novak/bin     # přidání na konec
PATH=/home/novak/bin:$PATH     # přidání na začátek

Tilda (~) striktně vzato proměnnou není, ale reálně se chová jako proměnná, obsahující domovský adresář právě přihlášeno uživatele. Proto následující příkazy dají stejný výsledek:

cd ~
cd $HOME
cd /home/novak
cd

První dva příkazy dají stejný výsledek vždy, třetí příkaz je ekvivalentní za předpokladu, že právě přihlášený uživatel je „novak“ a proměnná $HOME má hodnotu „/home/novak“. Nejrychlejší a nejjednodušší je čtvrtá varianta: cd (bez parametru) je totéž jako cd ~.

Můžeme vytvářet vlastní proměnné, které se pro snadné odlišení od proměnných prostředí obvykle píší pouze malými písmeny. Vlastní proměnné využijete především ve skriptech, kterými se zde blíže nezabýváme, proto jen malá ukázka (před a za rovnítkem nesmí být mezera):

jmeno=Jan
pocet=25
ks=5
let celkem=pocet*ks
echo "Jméno: $jmeno Počet: $pocet Kusů: $ks Celkem: $celkem"

Předposlední řádek ukázky let celkem=pocet*ks můžeme zapsat také následujícími způsoby:

((celkem=pocet*cena))
celkem=`expr $pocet '*' $cena`   # přenositelná varianta

Jen poslední varintu lze použít v shellu /bin/sh. Zpětné apostrofy v ní označují, že obsah se provede jako příkaz a nahradí se výsledkem. Hvězdička musí být v apostrofech, jinak se místo ní doplní jména souborů z aktuálního adresáře.

Za proměnné prostředí (environment variables) se označují ty proměnné, které se zpřístupňují spouštěným programům. Všechny proměnné prostředí vypíšete příkazem env, obvykle mají jména složená z velkých písmen. Proměnné z výše uvedené tabulky patří mezi proměnné prostředí. Striktně vzato mnohé z nich příkazový interpret získá při svém spuštění jako proměnné prostředí z programu, který ho spustil.

Následují ukázky začátku výpisu příkazů env (vypsání pouze proměnných prostředí) a set (vypsání všech proměnných v příkazovém interpretu).

env
SSH_CONNECTION=2001:718:1e02:42::38 32826 2001:718:1e02:18::87 22
LANG=en_US.UTF-8
EDITOR=vi
GPG_TTY=/dev/pts/0
...
set
BASH=/bin/bash
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
BASH_VERSION='4.4.12(1)-release'
COLUMNS=157
EDITOR=vi
...

Proměnná se začne předávat spouštěným programům, pokud se tzv. exportuje:

export BAR=FOO         # exportování proměnné BAR včetně přiřazení hodnoty FOO
BAR2=FOO2              # přiřazení hodnoty do proměnné BAR2
export BAR2            # a následné exportování proměnné

Pokud je proměnná označena pro export, tak při změně hodnoty není potřeba ji znovu exportovat.