BASH

Bash se spustí po přihlášení v textovém terminálu, nebo když otevřete konzoli automaticky. Měli byste vidět prompt příkazového řádku, který čeká na to, až zadáte nějaký příkaz (a stisknete enter).

petr@sallyx:~>

Prompt začíná jménem uživatele (loginem), následuje @, pak je jméno počítače (sallyx), dvojtečka, aktuální adresář (vlnovka ~ znamená domovský adresář) a špičatá závorka vyzývající k zadání příkazu.

Můžete si zkusit zadat první příkazy. Příkaz cd změní aktuální adresář. Argumentem příkazu je adresář, do kterého chcete přejít. Příkaz ls vypíše obsah adresáře. (Každou řádku musíte ukončit Enterem). Příkaz pwd vypíše aktuální adresář.

petr@sallyx:~> cd /home/
petr@sallyx:/home> ls
lost+found petr
petr@sallyx:/home> cd petr
petr@sallyx:~> pwd
/home/petr
petr@sallyx:~>

Všimněte si, jak se v promptu mění aktuální adresář. Příkaz ls vypsal dva adresáře (lost+found a petr) z adresáře /home.

Pro zjednodušení příkladů budu nadále v příkladech místo promptu uvádět pouze $. Takže předchozí příklad bude vypadat takto:

$ cd /home/
$ ls
lost+found petr
$ cd petr
$ pwd
/home/petr

Jedním z příkazů, které můžete zadat je i sám bash. (Prozatím zatajím, k čemu to může být dobré.) Aktuálně běžící bash se přesune do pozadí a vy budete pracovat v nově spuštěném bashi. Bash ukončíte příkazem exit, nebo pomocí CTRL+d. Když ukončíte poslední spuštěný bash, budete odhlášeni, nebo ukončíte konzoli (v grafickém rozhraní).

Zkratky

Příkazová řádka umožňuje zadané příkazy editovat, případně znovu vyvolat z historie. Například zkratka CTRL+r slouží k vyhledávání příkazů z historie.

Po stisknutí CTRL+r se místo promptu zobrazí (reverse-i-search)`':. Pak můžete začít psát a příkazová řádka zobrazuje příkazy z historie, které odpovídají sekvenci znaků, které píšete. Pokud se zobrazí příkaz, který chcete použít, stiskněte Enter. Pokud jej chcete předtím modifikovat, stisknete Escape nebo nějakou zkratku pro pohyb v příkazové řádce (nebo třeba jen šipku doleva).

V historii se taky můžete pohybovat pomocí šipek nahoru a dolů.

Pokud už máte napsaný nějaký příkaz a chcete jej změnit (předtím, než stisknete Enter), tak můžete přejít na místo, kde chcete editovat, pomocí šipek vlevo a v pravo, nebo některou z následujícíh zkratek.

_________________________________________________________________________
| Povely pro pohyb kurzoru a editaci příkazové řádky.                   |
|-----------------------------------------------------------------------|
| KLÁVESA               |       FUNKCE                                  |
|-----------------------------------------------------------------------|
| Ctrl+b nebo <-        |       posun o jeden znak dozadu               |
| Ctrl+f nebo ->        |       posun o jeden znak dopředu              |
| Ctrl+a                |       skok na začátek řádky                   |
| Ctrl+e                |       skok na konec řádky                     |
| Alt+b                 |       skok o jedno slovo dozadu               |
| Alt+f                 |       skok o jedno slovo dopředu              |
| Ctrl+l                |       vymazání obrazovky (jako cls v Dosu)    |
|-----------------------------------------------------------------------|
| Ctrl+d                |       mazání znaku pod kurzorem               |
| Backspace nebo Ctrl+h |       mazání znaku vlevo od kurzoru           |
| Alt+d                 |       mazání do konce slova vpravo od kurzoru |
| Alt+Backspace         |       mazání do začátku slova vlevo od kurzoru|
| Ctrl+k                |       mazání do konce řádky                   |
| Ctrl+u                |       mazání zpět do začátku řádky            |
|-----------------------------------------------------------------------|
| Ctrl+t                |       přehození znaku pod a před kurzorem *   |
| Alt+t                 |       přehození slov před a za kursorem       |
| Ctrl+v                |       následující znak se bude brát doslovně. |
|                               Např. Ctrl+v Ctrl+h nesmaže jeden znak  |
|                               z terminálu jako <Backspace>,           |
|                               ale napíše ^h)                          |
-------------------------------------------------------------------------
* Je-li kurzor na konci řádku, přehazují se 2 předchozí znaky

Příkaz clear vyčistí obrazovku stejně, jako Ctrl+l.

Když píšete nějaký příkaz, který má jako argument soubor, můžete pomocí tabulátoru nechat automaticky doplňovat jméno cesty k souboru. Ve jménech se defaultně rozlišuje velikost písmen, což se dá změnit v souboru ~/.inputrc přidáním řádky set completion-ignore-case on.

Ovlivňování běhu programů

Následující zkratky se vám také mohou často hodit.

ZkratkaVýznam
Ctrl+dKonec vstupu. Ukončí vstup pro programy, které na něj od vás čekají. Například bash očekává jako vstup názvy příkazů. Po stisku Ctrl+d se bash ukončí.
Ctrl+sPozastaví výstup na obrazovku. Program, který výstup na obrazovku produkuje se zablokuje, dokud výstup zase nespustíte pomocí Ctlr+q
Ctrl+qSpustí výstup pozastavený zkratkou Ctrl+s
Ctrl+cGeneruje znak del, nejčastěji se používá pro ukončení programu. Znak del je reprezentuje ^? a je možné jej příkazem stty nastavit místo ^c. Pak tento kód generuje klávesa delete. (Nikoliv Ctrl+?)
Shift+Page UpRoluje okno konzole, takže si můžete prohlédnout výstup, který už odroloval pryč.
Shift+Page DownRoluje okno konzole zpět (pokud bylo odrolováno pomocí Shift+Page Up).

Některé výše zmíněné zkraty lze vyzkoušet na programu top. Tento program zobrazuje seznam spuštěných procesů seřazený podle náročnosti (kolik zabírají paměti, procesoru atp.). Zhruba 1x za vteřinu se obsah aktualizuje. To můžete pozastavit pomocí Ctrl+s, znovu spustit pomocí Ctlr+q a program ukončit pomocí Ctlr+c.
Všiměte si, že Ctrl+d program top neukončí, to je totiž na každém programu, jak na „konec vstupu“ zareaguje.

Ctlr+c slouží k násilnému ukončení programu. Používejte to pouze v případech, že víte co děláte (například násilné ukončení programu top ničemu neublíží, ale normálně se ukončuje klávesou q). Ctlr+c se používá například na zabíjení programů, které se „kously“.

Terminálové funkce (obrazovka)

Tento blok se týká speciálních nastavení terminálu a je tu z historických důvodů. S klidným svědomím jej přeskočte.

stty -a
zjistí skutečné nastavení terminálových funckí (např. že kill=^U (^=CTRL))
stty erase "^h"
zaměňuje interpretaci backspace (pokud se místo mazání vypisuje ^h)
stty -echo
vypne vypisování psaných znaků (hodí se při zadávání hesla)
stty echo
zapne vypisování psaných znaků
Další možnosti stty
FunkceObvykleVýznam
erase^?mazani posledniho znaku
kill^umazani cele radky
werase^wmazani posledniho slova
intr^cukonceni beziciho programu
susp^zpozastaveni bezici ulohy
rprnt^ropetovne zobrazeni aktualni radky
stop^spozastavi vypis na terminalu (programy bezi ..)
start^qspusti vypis na terminal

Nastaví-li se start na ^s stejně jako stop, pak Ctrl+s pracuje jako přepínač …

Terminál se může působením různých vlivů, například výpisem binárního souboru na obrazovce, dostat do nedobrého stavu, kdy například nereaguje na nékteré klávesy, anebo zobrazuje různé podivné znaky. V takovém případě by měl pomoci jeden z příkazů reset anebo stty sane.
Pokud terminál nereaguje na klávesu <Enter>, můžete místo toho zkusit zakončít příkaz klávesou C-j.

Informace o terminálech jsou uloženy v souboru termcap a v adresáři terminfo.

Historie

Kromě interaktivního prohledávání historie klávesovou zkratkou CTRL+r nebo šipek nahoru a dolů můžete procházet historii pomocí následujících zkratek.

Historii si můžete nechat vypsat příkazem history. Tak získáte číslo příkazu, které se vám může hodit u některého z příkazů z následující tabulky.

Historii můžete smazat příkazem history -c.

Pokud zadáte nějaký příkaz odsazený ze začátku mezerou, nebude přidán do historie.

_________________________________________________________________________
| Povely pro práci s příkazovou historií                                |
|-----------------------------------------------------------------------|
| KLÁVESY               |       FUNKCE                                  |
|-----------------------------------------------------------------------|
| Ctrl-r                |       interaktivní prohledávání historie      |
| Ctrl-p nebo šipka ^   |       zobrazení předchozího příkazu           |
| Ctrl-n nebo šipka dolů|       zobrazení následujícího příkazu         |
| Alt-<                 |       skok na nejstarší uchovávaný příkaz     |
| Alt->                 |       skok na nejmladší (tj. aktuální) příkaz |
|-----------------------------------------------------------------------|
| PŘíKAZ                |       FUNKCE                                  |
|-----------------------------------------------------------------------|
| !!                    |       okamžité provedení předchozího příkazu  |
| !n                    |       provedení příkazu číslo "n" v historii  |
| !-n                   |       provedení n-tého předcházejícího příkazu|
| !?retezec             |       provedení nejbližšího předcházejícího   |
|                       |       příkazu obsahující řetězec              |
| history n             |       vypíše posledních n příkazů             |
-------------------------------------------------------------------------

Historie příkazů se ukládá do souboru ~/.bash_history.
Následující volby je možné zadat do konfiguračního souboru bashe ~/.bashrc.

export HISTFILESIZE=10000
Nastaví, kolik řádků si bude historie pamatovat.
shopt -s histappend
instance bashe si nebudou historii navzájem přepisovat

Echo

Příkaz echo slouží k vypsání textu na obrazovku. Hodí se při psaní skriptů, nebo při předávání textů jiným příkazům pomocí přesměrování vstupů (viz dále).

Text je většinou lepší vždy uvozovat do uvozovek, aby se předešlo interpretaci textu příkazovou řádkou přes predání textu příkazu echo.

SYNOPSIS

    echo [-e] [-n] text ...

OPTIONs

-e
Zapíná interpretace escape sekvencí, viz dále.
-n
vypíše text a neukončí řádek

EXAMPLES

$ echo Hello World
Hello World
$ echo "Hello\tWorld"
Hello\tWorld
$ echo -e "Hello\tWorld"
Hello   World
$ echo -n "Hello "; echo World
Hello World
$ echo $HOME
/home/petr

Escape sekvence

Escape sekvence jsou sekvence znaků se speciálním významem. Příkaz echo je interpretuje pouze s argumentem -e.

\t
Tabulátor
\0NNN
znak, jehož ASCII kód je NNN v osmičkové soustavě
\xNN
znak, jehož ASCII kód je NN v šestnáctkové soustavě
\\
zpětné lomítko
\a
zvonek (BEL). Na nových počítačích většinou nefunguje.
\b
backspace
\c
dále již nevypisovat nic. Nezobrazí se "nový řádek" (podobně jako s volbou -n) a ani nic dalšího.
\f
nová stránka (form feed)
\n
nový řádek (new line)
\r
návrat vozíku (carriage return)
\t
horizontální tabulátor
\v
vertikální tabulátor

Při používání escape sekvencí je potřeba mít text v uvozovkách, aby nebyly escape sekvence interpretovány už bashem (nebo se dají používat zpětná lomítka).

$ echo -e "Hello \c toto se uz nezobrazi"; echo World
Hello World
$ echo -e aaaaaaaaa\rXXX
aaaaaaaaarXXX
$ echo -e aaaaaaaaa\\rXXX
XXXaaaaaa
$ echo -e "aaaaaaaaa\rXXX"
XXXaaaaaa

Příklad na sledování velikosti souboru (který se třeba stahuje z internetu.

$  while (true)
do
     size=`ls -lh stahovany-soubor.mpeg`
     echo -e "$size\r\c"
     sleep 1
done

Barvy

Linuxovým terminálům, které podporují barvy (což už jsou dnes snad všechny), lze nastavit barvu pomocí speciální escape sekvence, která začíná na \033[ a končí znakem m. Barva se použije pro každý další výpis. Proto je dobré po každém vypsání obarveného textu nastavit původní systémovou barvu terminálu.

Základní barvy

0;30
Black
0;34
Blue
0;32
Green
0;36
Cyan
0;31
Red Light
0;35
Purple
0;33
Brown
0;37
Light Gray
1;30
Dark Gray
1;34
Light Blue
1;32
Light Green
1;36
Light Cyan
1;31
Red
1;35
Light Purple
1;33
Yellow
1;37
White

Nahoře jsou vypsány některé podporované barvy textu. Barva textu začíná trojkou, barvy pozadí začínají čtyřkou. (Např. 41 je červené pozadí).

Další info viz http://www.arwin.net/tech/bash.php.

Další escape sekvence

Tady je senzam escape sekvencí a jejich význam. Za znak # se dosazuje barva, viz výše.

\033[0m
Defaultní barva konzole
\033[1m
Tučný text
\033[0;#m
Nastaví barvu textu. Za # se dosadí číslo barvy, viz výše.
\033[1;#m
Tučný text se zadanou barvou. Tučnost mění zároveň barvu textu.
\033[2;#m
Trochu tmavší text zadané barvy
\033[3;#m
Italic text zadané barvy
\033[4;#m
Text zadané barvy a podtržený
\033[5;#m
Blikající text zadané barvy
\033[7;#m
Změní barvu a pak text invertuje
\033[41;#m
Změní barvu pozadí na červenou a text dle #
\033[A
posune kurzor jednu řádku nahoru (pozor: nesmaže dříve vypsaný text)
\033[B
posune kurzor jednu řádku dolů
\033[C
posune kurzor jeden znak do prava
\033[D
posune kurzor jeden znak do leva
\033[r,cf
posune kurzor na r-ty radeka c-ty sloupec (za r a c dosaďte číslo)
\033[2K
Smaže všechno na řádce napsané před touto sekvencí
\033[s
Uloží současnou pozici kurzoru
\033[u
Obnoví uloženou pozici kurozru

Posun kurzoru lze provést o N pozic takto: \033[N?, kde ? je A, B, C, nebo D a N je číslo.

Ne všechno musí všude fungovat (zvláště blikání, italic text, podtržení nebo kombinace barev v popředí a pozadí) Třeba blikání mi fungovalo jen v konzoli z prostředí KDE. V jiné konzoli se místo blikání změnila trochu barva, v další se nestalo vůbec nic.
Zdroj: http://www.cplusplus.com/forum/unices/36461/

EXAMPLES

$ echo -e "\033[1;31mBold text červenou barvou\033[0m"
Bold text červenou barvou
$ echo -e "\033[7;34mText s modrým pozadím a invertovanou barvou\033[0m"
Text s modrým pozadím a invertovanou barvou
$ esc="\033["
$ echo -e "${esc}47;31;1mČervený text s bílým pozadím${esc}0m"
Červený text s bílým pozadím
$ echo -e "${esc}31;47;1mČervený text s bílým pozadím${esc}0m"
Červený text s bílým pozadím
echo -e "\033[44;31mModré pozadí a červený text. \033[1mBold.\033[0m"
Modré pozadí a červený text. Bold.

Barvy lze použít i u promptu, který se mění pomocí proměnné PS1.

$ PS1='$\[\033[01;36m\]\u\[\033[01;31m\]@\
\[\033[01;36m\]\h\[\033[01;33m\]:\[\033[01;31m\]\w\[\033[01;33m\]\$\033[0m '
petr@edge:~$

Zpětné lomítko na konci řádku umožňuje zalomit příkaz na více řádek.

Více o nastavování promptu viz Vyhrazená jména - vnitřní proměnné shellu.
Více o barvách viz http://ubuntugenius.wordpress.com/2011/07/11/how-to-change-the-command-line-prompt-colour-in-the-ubuntulinux-terminal/

Speciální znaky

Standardní vstup je standardně klávesnice. Standardní výstup je standardně monitor. Standardní chybový výstup taky.

#
Uvozuje komentář. Vše za # je příkazovou řádkou ignorováno. Pokud má být # součástí argumentu příkazu, musí být v uvozovkách (jednoduchých nebo dvojitých).
$ echo ahoj #test
ahoj
$ echo "ahoj #test"
ahoj #test
|
tento specialni znak slouzi k vytvoreni programoveho kanalu tzv. roury (anglicky pipe). Propojeni dvou prikazu rourou znamena, ze standardni vystup prvniho prikazu je vyrovnavaci pameti propojen se standardnim vstupem prikazu druheho.

Obecny format je: prikaz | prikaz [|prikaz ...]

V příkladu je použit program wc, který přečete text ze standardního vstupu a spočítá znaky.

$ echo "ahoj" |  wc -m
5
Pokud se program wc spustí bez přesměrování standardního vstupu, očekává zadání textu, který se ukončí pomocí CTRL+d (konec souboru).
>
slouzi k presmerovani standardniho vystupu do souboru (misto na terminal). Pokud soubor zadaneho jmena neexistuje, tak je vytvoren, pokud jiz existuje, je prepsan!

Obecný formát je: prikaz > jmeno <Enter>

Presmerovani muze byt i do specialnich souboru, např. /dev/null, který slouží jako odpadkový koš, nebo /dev/tty?? ktery predstavuje terminal (můžete tak někomu něco napsat na obrazovku, pokud na to máte právo (jste root) :-)
>>
slouzi k presmerovani standardniho vystupu do souboru misto na obrazovku terminalu. Pokud soubor zadaneho jemna neexistuje, tak je vytvoren, pokud jiz existuje, pak je vystup prikazu pripojen na konec souboru.
2>
slouzi k presmerovani chyboveho vystupu.
$ echo "Hello World" > test.txt
$ echo "Hello World2" > test.txt
$ echo "Hello World3" >> test.txt
<
slouzi k presmerovani standardniho vstupu ze souboru misto z klavesnice.
Obecny format je: prikaz < jmeno_souboru <Enter>
$ cat < test.txt
Hello World2
Hello World3
$ wc < test.txt
 2  4 25

Přesměrování může proběhnout i pomocí tvz. deskriptorů, tj. čísel reprezentujících vstupy.

0 - standardní vstup
1 - standardní výstup
2 - standardní chybový výstup
>& cislice
soubor reprezentovany deskriptorem cislice je spojen se standardnim vystupem.
<& cislice
standardni vstup se bere ze souboru spojeneho s deskr. cislice
<&-
uzavreni standardniho vstupu
>&-
uzavreni standardniho vystupu
$ # ukládá stand. výstup i chybový výstup do jednoho souboru:
$ find /home/ -print > soubory.txt 2>1
$ # takhle to nefunguje!
$ find /home/ -print 2>&1 > soubory.txt
$ # ani takto to nefunguje
$ # (soubory.txt se otevírá 2x, ale soubor může být otevřen jen 1x):
$ find /home/ -print > soubory.txt 2> soubory.txt

Předchozí mechanismy lze libovolně spojovat. V následujícím příkladu se pošle text "Hello World" programu wc na standardní vstup. Jeho výsledek se pak přesměruje do souboru vysledek.txt (který se přepíše, pokud existuje).

$ echo "Hello World" | wc -m > vysledek.txt
$ cat < vysledek.txt
12
;
Umožňuje kombinovat příkazy. Příkazy jsou prováděny sekvenčně tak, jak jdou zasebou.
$ ls; who; date
lost+found  petr
petr     tty1         2013-06-24 16:51
petr     :0           2013-06-17 12:57 (console)
petr     pts/0        2013-06-17 12:58
petr     pts/1        2013-06-26 11:28
petr     pts/2        2013-06-24 10:43
petr     pts/3        2013-06-26 14:36
St čen 26 18:50:15 CEST 2013
$
&&
Podobné jako ;, pouze s tím rozdílem, že následující příkazy v řadě se provedou pouze tehdy, když ty předchozí uspějí.
$ cd /home/ && ls
lost+found  petr
$ cd /neexistujiciadresar ; ls
bash: cd: /neexistujiciadresar: Adresář nebo soubor neexistuje
lost+found  petr
$ cd /neexistujiciadresar && ls
bash: cd: /neexistujiciadresar: Adresář nebo soubor neexistuje
\
Vypíná speciální význam jednoho znaku nasledujícího za znakem \. Funguje i na <Enter>, takže lze pomocí lomítka rozdělit příkaz na více řádků. Příkazová řádka čekající na dokončení příkazu změní svůj prompt (na >).
$ ls \
> /home/
lost+found  petr
$ echo ahoj \| wc
ahoj | wc
&
Způsobí provádění příkazů na pozadí (asynchronně). Hodí se například při kopírování velkých souborů – kopírování bude probíhat na pozadí, takže dostanete k dipozici ihned prompt a můžete zadávat další příkazy.
`prikaz` obrácené apostrofy
Příkaz uvedený v obrácených apostrofech se nejprve nahradí svým výstupem a potom se teprve interpretuje celá příkazová řádka.
$ echo Dnes je `date`
Dnes je St čen 26 19:04:04 CEST 2013
Komentář Hlášení chyby
Created: 13.7.2013
Last updated: 10.10.2014
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..