Tipy pro práci v bashi a na Linuxu

Shell a bash

Shell je vrchná vrstva operačného systému, ktorá nám ho umožňuje ovládať — nazývame ho užívateľským rozhraním. Bežne ho reprezentuje terminál (CLI) alebo grafické prostredie (GUI). Príkladom GUI je bežné desktopové prostredie s oknovým systémom, teda pracovná plocha a okná s programami.

Na Linuxe je okrem GUI bežné ovládanie pomocou textu — príkazového riadku, zadávaním príkazov do terminálu (dnes sa spomína aj názov konzola, kedysi mali pojmy iný význam, viď. wiki).

Bash je program, s ktorým v termináli komunikujeme — je implementáciou terminálového shellu. Interpretuje naše príkazy, umožňuje nám spúšťať programy a dokonca aj písať skripty.

terminal bash line

V príklade nám ukazuje užívateľské meno — xrehacek, na ktorom počítači sme — @home, v ktorom adresári sa nachádzame — ~/pb071 a za symbolom doláru $ očakáva náš príkaz (taký symbol s čakaním na vstup voláme prompt).

Užitočné znalosti

Pracovný adresár (current working directory/cwd) je aktuálne zvolený adresár, v ktorom robíme zmeny. V termináli je zobrazený pred našimi príkazmi.
Absolútna cesta začína vždy /, teda od koreňového adresára.
Relatívna cesta pokračuje od nášho pracovného adresára.
Vlnka ~ (en: tilde) je skratka pre náš domovský adresár (home directory), umiestnený v /home/USERNAME/, ktorý obsahuje naše súbory.

Ak sa nachádzame v domovskom adresári a chceme vstúpiť do adresáru pb071, môžeme vykonať cd pb071 (relatívna cesta) alebo cd /home/USERNAME/pb071 (absolútna cesta).
Ak by sme sa nachádzali mimo nášho dom. adresára, využijeme vlnku, teda cd ~/pb071.
Na vstup do domovského adresára použijeme iba cd.

terminal cd example

Každý adresár obsahuje dva špeciálne súbory: ., ktorá je odkazom na aktuálny adresár; a .. ako odkaz na rodičovský adresár. Cesta cd ../.. by nás dostala o dva adresáre vyššie.

Neštandardné programy (naše, ktoré budeme kompilovať) sa spúšťajú z bezpečnostných dôvodov pridaním ./ pred názov programu. Napríklad ./hw01. Potrebujeme totiž odlíšiť bežné programy/príkazy od tých, čo sú v aktuálnom adresári pod rovnakým názvom — aby sa nám nestalo, že ls zmaže celý systém.

Klávesové skratky

Tab požiada o inteligentné doplnenie príkazu. Doplňuje napríklad cestu u príkazov ako cd alebo mv. Dvojité stlačenie môže zobraziť všetky možnosti, napríklad u ls.

Ctrl+r hľadá v histórii príkazov

alebo prechádza cez históriu príkazov

Ctrl+c požiada program o ukončenie; zmaže rozpísaný riadok s príkazom

Ctrl+d vyšle na terminál symbol konca súboru (EOF, end of file). Ukončí tým načítavanie vstupu u niektorých príkazov (ako cat).

Ctrl+l vyčistí terminál

Extra tip: text býva po označení skopírovaný a môžeme ho vložiť pravým tlačidlom myši.

Základné príkazy

príkaz syntax a význam príklad

ls

výpis súborov
(list)

ls [options] [files]
ls vypíše názvy viditeľných súborov v riadku
ls pb071 vypíše súbory v adresári pb071
ls -la vypíše aj skryté súbory a s podrobnosťami
ll alebo la bývajú aliasy na niektoré možnosti (líši sa u distribúcií)

cd

zmena pracovného adresára
(change directory)

cd [options] [directory]
cd alebo cd ~ náš domovský adresár (/home/xlogin/)
cd pb071 vstúpime do adresára pb071
cd /home/xlogin/pb071
cd .. rodičovský adresár (.. je odkaz na adresár vyššie)
cd - nás vráti na predchádzajúci adresár

mkdir

vytvorenie adresárov
(make directory)

mkdir [options] directory_names
mkdir pb071
mkdir pb071-1 pb071-2 pb071-3 mkdir -p 1/2/3 vytvorí celú cestu, nezlyhá, ak už adresáre existujú

rm

zmazanie súborov bez potvrdenia
(remove)

rm [options] files
rm hello.c zmaže súbor hello.c
rm 1.c 2.c 3.c zmaže všetky tri súbory
rm *.o zmaže všetky súbory s príponou .o
rm -r hello/ prepínač -r (recursive) zabezpečí aj zmazanie adresára, spolu s celým obsahom

cat

výpis obsahu súboru, spájanie súborov
(concatenate)

cat [options] [files]
cat hello.c vypíše na štandardný výstup obsah hello.c
cat 1.c 2.c 3.c spojí všetky súbory a vypíše výsledný súbor (preto concatenate)

less

zobrazuje súbory (bez výpisu na terminál)

less hello.c

cp

kopíruje súbory a adresáre (bez -i prepisuje bez upozornenia)
(copy)

cp [options] sources target
cp hello.c ./pb071/1/ nakopíruje hello.c do pb071/1/
cp f1 f2 f3 dir skopíruje všetky tri súbory do adresára dir
cp -i hello.c dir vypýta si potvrdenie na prepísanie súboru, ak už v dir existuje cp -r dir1 dir2 prepínač -r (recursive) skopíruje celý adresár
cp -r dir1/* dir2 všetky súbory vnútri dir1 do dir2
cp *.c pb071 súbory s príponou .c

mv

premenuje alebo presunie súbory a adresáre (bez -i prepisuje bez upozornenia)
(move)

mv [options] from where
mv hello.c h.c premenuje hello.c
mv hello.c pb071/hello.c presunie hello.c do adresára pb071
mv -i hello.c h.c vypýta si potvrdenie na prepísanie súboru, ak h.c už existuje mv * ~ presunie všetky súbory aktuálneho adresára do domovského

grep

vyhľadáva v súboroch

grep [options] pattern [files]
grep 'My money' bar1 bar2 bar3 hľadá moje peniaze v troch baroch
grep -i 'My MoNEy' bar* vo všetkých baroch a case-insensitive
grep 'My money' * vo všetkých textových súboroch aktuálneho adresáru
grep -r 'My money' * v celom adresárovom strome
ls | grep 'file' hľadá vo výpise ls (operátor pipe)

man

zobrazí interaktívnu nápovedu
(manual)

man mv k bash príkazu mv
man printf k programu printf
man 3 printf k funkcii printf (v 3. kapitole, knižničných funkcií) — pod rovnakým menom môže byť viacero záznamov, čísla kapitol man man

Presmerovanie vstupu a výstupu

Operátor > dokáže uložiť výstup programu do súboru, výstup presmeruje z nášho terminálu.

prepíše out.txt výstupom programu hello (out.txt vytvorí, prípadne pred zápisom zmaže jeho obsah)
./a > out.txt

Operátor append >> využijeme, ak súbor nechceme prepísať:

obsah súboru hello.c zapíše za koniec súboru hello2.c
cat hello.c >> hello2.c

Napríklad v spojení s programom diff môžeme porovnať výstup svojho programu s referenčnou implementáciou, aby sme predišli ťažko všimnuteľným chýbam (často nadbytočné medzery, whitespace).

zapíše výstupy programov do súborov a vypíše medzi nimi rozdiel
./a > a.txt && ./b > b.txt && diff a.txt b.txt
cat bez parametrov nás nechá písať to, čo chceme uložiť, kým neohlásime koniec súboru (Ctrl+d)
cat > hello.c

Operátorom | (pipe, rúra) prepojí štandardný výstup programu vľavo so štandardným vstupom programu vpravo. Analógia rúry naozaj sedí: na jednom konci program do rúry posiela veci, ktoré tečú na druhý koniec rúry niekomu inému.

vyhľadávanie súboru „file“
ls -la | grep 'file'
Porovnanie výstupu programov
spustí oba programy a vypíše odlišnosti v ich výstupe (<(), process substitution)
diff <(./a) <(./b)
vizuálne porovnanie pomocou programu vim. Ľahko objavíme chyby s bielymi znakmi, whitespace
vimdiff <(./a) <(./b)