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).
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:/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:
$ 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.
Zkratka | Význam |
---|---|
Ctrl+d | Konec 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+s | Pozastaví výstup na obrazovku. Program, který výstup na obrazovku produkuje se zablokuje, dokud výstup zase nespustíte pomocí Ctlr+q |
Ctrl+q | Spustí výstup pozastavený zkratkou Ctrl+s |
Ctrl+c | Generuje 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 Up | Roluje okno konzole, takže si můžete prohlédnout výstup, který už odroloval pryč. |
Shift+Page Down | Roluje 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.
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ů
Funkce | Obvykle | Význam |
---|---|---|
erase | ^? | mazani posledniho znaku |
kill | ^u | mazani cele radky |
werase | ^w | mazani posledniho slova |
intr | ^c | ukonceni beziciho programu |
susp | ^z | pozastaveni bezici ulohy |
rprnt | ^r | opetovne zobrazeni aktualni radky |
stop | ^s | pozastavi vypis na terminalu (programy bezi ..) |
start | ^q | spusti 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
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).
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.
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).
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.
5
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 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>
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
$ 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).
$ cat < vysledek.txt
12
- ;
- Umožňuje kombinovat příkazy. Příkazy jsou prováděny sekvenčně tak, jak jdou zasebou.
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í.
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
>
).
> /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.
Dnes je St čen 26 19:04:04 CEST 2013