Každá časť má najprv poznámky (čo príkaz a jeho prepínače znamenajú) a pod nimi krátke príklady. Za $ je to, čo píšeš, riadky bez $ vypíše bash a za ← je vysvetlenie. Všetky príklady sa odohrávajú v tomto priečinku:
/home/jano/skola/
├── ovocie.txt jablko / hruska / slivka (3 riadky)
├── zvierata.txt na grep (obsah v časti 8)
├── cisla.txt na sort a uniq (obsah v časti 10)
├── skript.sh
├── .skryty skrytý súbor (meno začína bodkou)
└── data/
├── udaje.txt
└── zaloha/
└── stare.txt
1 · Orientácia: pwd, ls, cd
Poznámky
pwd = print working directory, vypíše, kde práve stojíšls = vypíše obsah aktuálneho priečinka (alebo zadaného: ls data)ls -a = aj skryté súbory, vrátane . (tento priečinok) a .. (rodič)ls -A = skryté súbory bez . a ..ls -l = dlhý výpis (práva, vlastník, veľkosť, dátum)ls -h = veľkosti čitateľne (K, M, G), -r = opačné poradie, -1 = jeden súbor na riadokls -R = rekurzívne (aj podpriečinky). Bez -R ls do podpriečinkov nejde.cd priecinok = vojdi do priečinka, cd .. = o úroveň vyššiecd, cd ~ alebo cd $HOME = domov (/home/jano)cd - = späť do predošlého priečinka/home = priečinok všetkých používateľov, nie tvoj domov- cesta začínajúca
/ je absolútna, ostatné sú relatívne (od miesta, kde stojíš)
Príklady
$ ls
cisla.txt data ovocie.txt skript.sh zvierata.txt ← .skryty tu nie je
$ ls -A
.skryty cisla.txt data ovocie.txt skript.sh zvierata.txt
$ cd data
$ pwd
/home/jano/skola/data
$ cd /etc
$ cd - ← späť tam, kde som bol
/home/jano/skola
$ cd ← domov
$ pwd
/home/jano
Pozor: „Vypíš aktuálny priečinok, nech som kdekoľvek“: správne sú ls a ls $PWD. ls ~ a ls $HOME vypíšu domov, ls / koreň disku a echo .* iba skryté súbory.
2 · Pozeranie súborov: cat, tac, less, head, tail, wc
Poznámky
cat subor = vypíše celý súbor. Viac súborov spojí za sebou (concatenate). Bez súboru číta z klávesnice.tac subor = vypíše súbor odzadu (posledný riadok prvý)less subor = listovanie: medzera ďalej, b späť, /slovo hľadaj, n ďalší výskyt, g začiatok, G koniec, q koniechead subor = prvých 10 riadkov, head -3 alebo head -n 3 = prvé 3tail subor = posledných 10 riadkov, tail -1 = posledný riadoktail -n +2 = od 2. riadku do konca (nie posledné 2!)wc = počíta: -l riadky, -w slová, -c bajty
Príklady
$ tac ovocie.txt
slivka
hruska
jablko
$ head -2 ovocie.txt
jablko
hruska
$ tail -n +2 ovocie.txt ← od 2. riadku
hruska
slivka
$ wc -l ovocie.txt
3 ovocie.txt
$ wc -l < ovocie.txt ← zo stdin: meno súboru sa nevypíše
3
3 · echo, úvodzovky, premenné
Poznámky
echo text = vypíše text a nový riadokecho -n = bez nového riadku na konciecho -e = interpretuje \n (nový riadok), \t (tabulátor), \\. Bez -e sa vypíšu doslova.- priradenie:
x=hodnota bez medzier okolo =. Čítanie: $x alebo ${x}. "..." (dvojité úvodzovky) = rozvinie $premenna aj $(prikaz), zachová medzery'...' (jednoduché) = nerozvinie nič, všetko je doslova\" = escapnutá úvodzovka (vypíše sa)$(prikaz) alebo prikaz = nahradí sa výstupom príkazucat <<< text = reťazec ide na stdin príkazu$HOME domov, $USER meno, $PWD aktuálny priečinok, $SHELL cesta k shellu$$ = PID aktuálneho shellu$? = návratový kód posledného príkazu (0 = OK, iné = chyba)$_ = posledný argument predošlého príkazu!! = zopakuj posledný príkaz, !ec = posledný príkaz začínajúci na „ec“history = história príkazov (~/.bash_history), Ctrl+R = hľadanie v nej- pomoc:
man prikaz, help cd (vstavané príkazy), prikaz --help
Príklady
$ meno=Jano
$ meno = Jano
meno: command not found ← s medzerami bash hľadá príkaz „meno“
$ echo "Ahoj $meno"
Ahoj Jano
$ echo 'Ahoj $meno'
Ahoj $meno
$ echo "${meno}ko"
Janoko
$ echo "$menoko"
← premenná „menoko“ neexistuje, takže prázdny riadok
$ echo \"Ahoj svet\"
"Ahoj svet"
$ echo '"Ahoj svet"'
"Ahoj svet"
$ echo ""Ahoj svet"" ← "" je prázdny reťazec, takže úvodzovky zmiznú
Ahoj svet
$ echo "ah""oj" ← reťazce vedľa seba sa spoja
ahoj
$ echo $(echo ahoj)
ahoj
$ $(echo ls -la) ← výsledok „ls -la“ sa SPUSTÍ ako príkaz
$ ls neexistuje
ls: cannot access 'neexistuje': No such file or directory
$ echo $?
2 ← chyba
$ echo $?
0 ← teraz 0, lebo posledný príkaz bol úspešný echo
4 · Práva: chmod, chown, mkdir
Poznámky
ls -l ukáže napríklad -rwxr-x---. Prvý znak je typ (- súbor, d adresár, l link), potom 3 trojice: user, group, others.- súbor:
r čítať, w zapisovať, x spustiť - adresár:
r vypísať obsah (ls), w vytvárať a mazať v ňom, x vojsť doň (cd) - čísla:
r = 4, w = 2, x = 1, sčítajú sa: 7 = rwx, 6 = rw-, 5 = r-x, 4 = r--, 0 = --- chmod 644 f = nastaví presne rw-r--r--, nezávisle od pôvodných právchmod u+w pridá, g-w uberie, o=r nastaví presne. Kto: u user, g group, o others, a všetci.chmod +x f = bez u, g alebo o: všetkým+ a - menia práva relatívne k pôvodným, takže výsledok závisí od toho, čo súbor malchown jano:skupina f = zmeň vlastníka a skupinu (treba sudo), -R = rekurzívnemkdir -p a/b/c = vytvorí aj chýbajúce priečinky po ceste, mkdir -m 700 d = rovno s právami
Príklady
$ ls -l f
-r--r--r-- f
$ chmod u+w f
-rw-r--r-- f
$ chmod g+wx f
-rw-rwxr-- f
$ chmod u=rwx,g=rx,o= f ← o= znamená, že ostatní nemajú nič
-rwxr-x--- f
$ chmod 644 f
-rw-r--r-- f
Pozor: chmod 444 f; chmod u+w f dá vždy rw-r--r--. chmod 222 f; chmod u+w f dá -w--w--w-, čo je zle. Samotné chmod u+w f výsledok nezaručí, lebo nevieš, aké práva mal súbor predtým.
5 · Procesy: ps, kill, pozadie
Poznámky
ps = procesy v tomto termináli, ps x = všetky moje, ps ax = všetkých používateľov, ps aux = aj s menom používateľaprikaz & = spusti na pozadíkill PID = pošle signál, predvolene SIGTERM (15), ktorý sa dá zachytiť aj ignorovaťkill -9 PID = SIGKILL, nedá sa zachytiť ani ignorovaťkill -CONT PID = spustí zastavený procesCtrl+Z = proces zastaví (neukončí). Ctrl+C = preruší, čiže ukončí (SIGINT).w a who = kto je prihlásený, last = posledné prihlásenia
Príklady
$ sleep 100 &
[1] 4242 ← PID
$ kill 4242
[1]+ Terminated sleep 100
$ sleep 100
^Z
[1]+ Stopped sleep 100 ← iba zastavený
$ kill -CONT %1 ← znova beží
Pozor: Pri kill sú nepravdivé tvrdenia „predvolený signál je SIGKILL“, „vždy ukončí proces“ a „signál sa nedá ignorovať“.
6 · Glob (* ? [ ]): rozvíja ho BASH
Poznámky
- glob = vzor na mená súborov. Bash ho nahradí menami pred spustením príkazu.
* = hocijaké znaky (aj žiadne)? = presne jeden znak[ab] = jeden znak, a alebo b. [0-9] = jedna číslica.- skryté súbory (s bodkou)
* nezahŕňa - ak nič nesedí, vzor ostane tak, ako je
Príklady
$ echo *.txt
cisla.txt ovocie.txt zvierata.txt
$ echo ?????.txt ← 5 znakov + .txt
cisla.txt
$ echo [cz]*
cisla.txt zvierata.txt
$ echo .*
. .. .skryty
$ echo *.pdf
*.pdf ← nič nesedí
7 · find: hľadanie SÚBOROV
Poznámky
- tvar:
find [kde] [podmienky] [akcia]. Bez cesty hľadá v . a bez akcie výsledky vypíše (-print). - find je vždy rekurzívny
-name "vzor" = meno súboru (iba posledná časť cesty), rozlišuje veľké a malé písmená, glob vzor-iname = meno, nerozlišuje veľké a malé písmená (insensitive)-path / -ipath = porovnáva celú cestu-type f súbor, -type d adresár, -type l link-maxdepth 1 = iba tu, bez podpriečinkov-mtime = zmena obsahu (dni), -ctime = zmena statusu (práva, vlastník, nie creation!), -atime = prístup (čítanie)-mmin, -cmin, -amin = to isté v minútach- čísla pri čase aj veľkosti:
-3 = menej ako, +3 = viac ako, 3 = presne -size: c = bajty, k = KiB, M = MiB, G = GiB. Bez jednotky (alebo b) = 512-bajtové bloky.- podmienky za sebou = AND.
-or = alebo, ! alebo -not = negácia. AND má prednosť pred OR. - zátvorky treba escapnúť a oddeliť medzerami:
\( ... \) -delete = zmaže nájdené-exec prikaz {} \; = spustí príkaz pre každý súbor zvlášť ({} = súbor)-exec prikaz {} \+ = spustí príkaz raz so všetkými súbormi- vzor daj do úvodzoviek, inak ho bash rozvinie skôr, než sa find spustí
Príklady
$ find . -name "*.txt"
./ovocie.txt
./zvierata.txt
./cisla.txt
./data/udaje.txt
./data/zaloha/stare.txt ← aj hlboko v podpriečinkoch
$ find . -name "ovocie" ← presné meno, takže nič
$ find . -name "*ovocie*"
./ovocie.txt
$ find . -maxdepth 1 -type d
.
./data
$ find . -path "*zaloha*"
./data/zaloha
./data/zaloha/stare.txt
$ find . -name "*.txt" -exec wc -l {} \; ← wc 5-krát
3 ./ovocie.txt
7 ./zvierata.txt
...
$ find . -name "*.txt" -exec wc -l {} \+ ← wc 1-krát
...
22 total
$ find . -name "*.txt" | wc -l
5 ← toto je POČET SÚBOROV, nie ich riadkov!
Pozor: find . -name *.txt bez úvodzoviek: bash rozvinie *.txt v aktuálnom priečinku, takže find dostane -name cisla.txt ovocie.txt zvierata.txt a skončí chybou.
Pozor: find . -name "*.c" -or -name "*.h" -delete zmaže iba .h súbory, lebo -delete sa naviaže iba na poslednú časť. Správne je \( ... -or ... \) -delete.
8 · grep: hľadanie TEXTU v súboroch
Poznámky
- tvar:
grep [prepínače] 'vzor' [súbory]. Bez súboru číta zo stdin (z pipe). - vypisuje celé riadky, v ktorých je vzor kdekoľvek
-i = nerozlišuje veľké a malé písmená-v = invertuje: riadky, ktoré vzor NEobsahujú-w = iba celé slová-c = počet riadkov so zhodou (nie počet výskytov)-o = vypíše iba zhodnú časť, každú zhodu na nový riadok-n = pridá čísla riadkov-l = iba mená súborov so zhodou-r = rekurzívne v priečinku, -R = aj cez symlinky-q = nič nevypíše, výsledok je iba v $? (0 = našiel, 1 = nenašiel)-A 2 = aj 2 riadky za zhodou (After), -B 2 = pred zhodou (Before)-E = rozšírený regex (sprístupní + ? | { } ( ))- pri viacerých súboroch je pred riadkom meno súboru:
subor:riadok - prepínače sa dajú spájať:
-vc, -in…
Regex (iný ako glob!)
. = ľubovoľný jeden znak* = predchádzajúci znak 0 a viackrát (nie „hocičo“!).* = hocičo^ = začiatok riadku, $ = koniec riadku, ^$ = prázdny riadok[abc] = jeden z týchto znakov, [^abc] = jeden znak, ktorý NIE JE a, b ani c[0-9], [a-z], [[:alpha:]] (písmeno), [[:digit:]] (číslica)\< a \> = začiatok a koniec slova- iba s
-E: + = 1 a viac, ? = 0 alebo 1, {3} = presne 3-krát, {3,5} = 3 až 5-krát, {3,} = aspoň 3-krát, a|b = a alebo b, ( ) = skupina - bez
-E treba tieto znaky escapnúť: \{3\}, \+ \. = obyčajná bodka
Príklady
Obsah zvierata.txt: pes, macka, Pes je dobry, # komentar, kocur a pes, pesnicka a prázdny riadok (7 riadkov).
$ grep pes zvierata.txt
pes
kocur a pes
pesnicka ← „pes“ je aj vnútri slova
$ grep -i pes zvierata.txt
pes
Pes je dobry
kocur a pes
pesnicka
$ grep -w pes zvierata.txt
pes
kocur a pes
$ grep -c pes zvierata.txt
3
$ grep -vc pes zvierata.txt ← riadky BEZ „pes“: macka, Pes je dobry, # komentar, prázdny
4
$ grep '^pes' zvierata.txt
pes
pesnicka
$ grep 'pes$' zvierata.txt
pes
kocur a pes
$ grep -c '^$' zvierata.txt
1
$ grep -E 'macka|kocur' zvierata.txt
macka
kocur a pes
$ grep 'macka|kocur' zvierata.txt ← bez -E hľadá doslova „macka|kocur“, takže nič
$ grep 'ab*c' ← sedí na ac, abc, abbbc (b je 0+ krát)
Pozor: find hľadá súbory podľa mena, grep hľadá text v obsahu. grep "A*" /public nenájde súbory začínajúce na A.
9 · Presmerovanie: >, >>, 2>, 2>&1, <
Poznámky
- každý príkaz má stdout (1), čiže normálny výstup, a stderr (2), čiže chyby. Oba idú štandardne na obrazovku.
> f = stdout do súboru. Súbor sa vytvorí alebo vymaže ešte pred spustením príkazu.>> f = stdout sa pripíše na koniec súboru (vytvorí ho, ak neexistuje)2> f = iba chyby do súboru2> /dev/null = zahoď chyby (/dev/null je čierna diera)> f 2>&1 = stdout aj stderr do f (skratka &> f)2>&1 = stderr pošli tam, kam práve teraz ide stdout. Bash číta presmerovania zľava doprava, takže poradie je dôležité.1>&2 = stdout na stderr. Bez & (1>2) vznikne súbor s menom „2“.< f = obsah súboru ide na vstup príkazu
Príklady
$ echo ahoj > pozdrav.txt
$ cat pozdrav.txt
ahoj
$ echo cau > pozdrav.txt ← > prepíše
$ echo svet >> pozdrav.txt ← >> pripíše
$ cat pozdrav.txt
cau
svet
$ ls neexistuje > vypis.txt
ls: cannot access 'neexistuje': No such file or directory ← chyba ide stále na obrazovku
$ cat vypis.txt
← PRÁZDNY: > ho vymazal a ls doň nič nezapísal
$ ls neexistuje 2> chyby.txt
← na obrazovke nič, chyba je v chyby.txt
$ ls ovocie.txt neexistuje > vsetko.txt 2>&1
$ ← oboje je v súbore
$ ls ovocie.txt neexistuje 2>&1 > vsetko.txt
ls: cannot access 'neexistuje': ... ← chyba je na OBRAZOVKE
← 2>&1 sa vykonalo prvé, keď stdout ešte šiel na obrazovku
Pozor: V priečinku je iba subor1 a spustíš ls subor2 > vypis.txt; ls >> vypis.txt. Chyba ide na obrazovku. vypis.txt sa vytvorí alebo premaže a bude obsahovať dva riadky, subor1 a vypis.txt, lebo druhé ls už súbor vidí.
10 · Pipe | a textové nástroje
Poznámky
a | b = stdout príkazu a ide na vstup príkazu b. Oba bežia súčasne ako samostatné procesy.- pipe prenáša iba stdout. Chyby prenesie iba
2>&1 | alebo skratka |&. > vedie do súboru, | vedie do príkazu- ak príkaz v pipe dostane meno súboru, číta zo súboru a pipe ignoruje
$? po pipe = návratový kód posledného príkazu v pipesort = triedi ako text (preto je „10“ pred „9“)sort -n číselne, -r zostupne, -u bez duplicít, -t, -k2 podľa 2. stĺpca oddeleného čiarkouuniq = odstráni iba susedné duplicity, preto pred ním takmer vždy ide sortuniq -c = pred každý riadok pridá počet výskytov, uniq -d = iba duplicitné riadkycut -d: -f1 = 1. stĺpec (field), oddeľovač :. -f1,7 = 1. a 7. stĺpec.tr a-z A-Z = nahrádza znaky, tr -d ' ' = zmaže znakytee f = pošle výstup na obrazovku aj do súboruxargs prikaz = zo vstupu spraví argumenty príkazu
Príklady
$ ls ovocie.txt neexistuje | wc -l
ls: cannot access 'neexistuje': ... ← chyba obišla pipe
1
$ ls ovocie.txt neexistuje 2>&1 | wc -l
2
$ ls ovocie.txt neexistuje |& wc -l
2
$ ls neexistuje 2>&1 >/dev/null | wc -l
1 ← do pipe ide iba chyba
Obsah cisla.txt: 3 10 3 7 10 3 (každé číslo na riadku).
$ sort cisla.txt ← ako text
10 10 3 3 3 7
$ sort -n cisla.txt
3 3 3 7 10 10
$ uniq cisla.txt ← nič sa nezmení, lebo duplicity nie sú vedľa seba
3 10 3 7 10 3
$ sort cisla.txt | uniq -c | sort -nr
3 3
2 10
1 7 ← najčastejšie navrchu
$ cut -d: -f1,7 /etc/passwd
root:/bin/bash
jano:/bin/bash
$ echo ahoj | tr a-z A-Z
AHOJ
$ head -5 subor | tail -1 ← 5. riadok
$ head -1 subor | tail -1 subor ← tail má vlastný súbor, takže vypíše POSLEDNÝ riadok
Pozor: „10 najčastejších čísel“: sort | uniq -c | sort -nr | head je správne a sort | uniq -c | sort -n | tail tiež. uniq -c bez predošlého sort je zle.
11 · Skripty a argumenty
Poznámky
#!/bin/bash (shebang) = prvý riadok, za ním cesta k interpretu. Nie je povinný, súbor ním nebude spustiteľný a nie je to meno autora../skript.sh potrebuje chmod +xbash skript.sh funguje aj bez +xskript.sh bez cesty funguje, iba ak je jeho priečinok v $PATH. Aktuálny priečinok . v PATH nie je.$PATH = priečinky so spustiteľnými programami oddelené :. Dá sa meniť a každý používateľ ho môže mať iný.$0 = meno skriptu (shift ho nemení)$1, $2… = argumenty$# = počet argumentov$@ = všetky argumenty. "$@" = každý zvlášť (správny spôsob).$* = všetky argumenty. "$*" = jeden reťazec.shift = zahodí $1 a posunie ostatné, shift 2 = o dvaexit 1 = ukončí skript s návratovým kódom 1export X=1 = premenná bude viditeľná aj v spustených skriptoch (detských procesoch)source s.sh alebo . s.sh = vykoná skript v aktuálnom shellibasename /a/b/c.txt = c.txt (posledná časť), dirname /a/b/c.txt = /a/b (všetko okrem nej)
Príklady
$ cat skript.sh
#!/bin/bash
echo "$0 | $1 | $2 | $#"
shift
echo "$1 | $#"
$ ./skript.sh jablko "zelena hruska" slivka
./skript.sh | jablko | zelena hruska | 3 ← úvodzovky držia „zelena hruska“ pokope
zelena hruska | 2
$ ./skript.sh
bash: ./skript.sh: Permission denied ← chýba +x
$ bash skript.sh ← funguje
$ skript.sh
skript.sh: command not found ← „.“ nie je v PATH
$ echo '$PATH'
$PATH ← v jednoduchých úvodzovkách sa nerozvinie
pri spustení ./s.sh a "b c":
for x in "$@" → [a] [b c] (2-krát, správne)
for x in "$*" → [a b c] (1-krát)
for x in $@ → [a] [b] [c] (3-krát)
Pozor: Na vypísanie všetkých argumentov while (( "$#" )); do echo "$1"; shift; done funguje. while [ "$#" ]; ... je nekonečný, lebo „0“ je neprázdny reťazec, takže podmienka je stále pravdivá.
12 · Podmienky, cykly, aritmetika
Poznámky
$((a + b)) = aritmetika, iba celé čísla (7 / 2 = 3, % = zvyšok)[ $a -eq $b ] čísla: -eq =, -ne ≠, -lt <, -le ≤, -gt >, -ge ≥(( a > b )) = číselné porovnanie, kde sa smie písať >[ "$a" = "$b" ], != = porovnanie reťazcov (medzery okolo sú povinné)-f existuje a je súbor, -d adresár, -e existuje, -r/-w/-x práva, -z prázdny reťazec, -n neprázdny reťazec- v
[ ] znamená > presmerovanie: [ 5 > 3 ] vytvorí súbor „3“ a && b = b sa vykoná, iba ak a uspela || b = b sa vykoná, iba ak a zlyhala ; b = b sa vykoná vždy- cykly:
for i in 1 2 3, for i in $(seq 10 20), for ((i=0; i<5; i++)), while read r; do ...; done < subor
Príklady
$ a=5; b=3
$ echo $a+$b
5+3
$ echo $((a + b))
8
$ [ $a -gt $b ] && echo vacsie
vacsie
$ [ -d data ] && echo adresar
adresar
$ ls xyz || echo zlyhalo
ls: cannot access 'xyz': ...
zlyhalo
$ for i in $(seq 1 3); do echo "cislo $i"; done
cislo 1
cislo 2
cislo 3
$ while read r; do echo "-> $r"; done < ovocie.txt
-> jablko
-> hruska
-> slivka
Pozor: Pri for i in $(seq 10 20); do echo "cislo $i" > subor; echo $i; done sa na obrazovku vypíšu čísla 10 až 20. Súbor sa však v každom kole prepíše (>), takže v ňom ostane iba cislo 20.
13 · Polia
Poznámky
z=(a b "c d") = pole s 3 prvkami (úvodzovky držia „c d“ pokope)${z[0]} = prvý prvok (indexy sú od 0)$z bez indexu = iba prvý prvok${z[@]} = všetky prvky${#z[@]} = počet prvkov${#z[0]} = dĺžka reťazca v prvku 0${!z[@]} = indexy, ${z[-1]} = posledný prvok${z[@]:1:2} = od indexu 1 dva prvkyz+=(x) = pridá prvok, z[1]=X = zmení prvok"${z[@]}" s úvodzovkami = prvky ostanú celé. Bez úvodzoviek sa prvky s medzerou rozdelia.
Príklady
$ z=(jeden dva "tri styri")
$ echo ${z[0]}
jeden
$ echo $z
jeden ← iba prvý prvok!
$ echo ${#z[@]}
3
$ echo ${#z[0]}
5 ← dĺžka slova „jeden“
$ z+=(pat)
$ echo ${z[@]}
jeden dva tri styri pat
$ k=(${z[@]}) ← bez úvodzoviek
$ echo ${#k[@]}
5 ← „tri styri“ sa rozdelilo
Pozor: Zo starého testu: zoznam=(jeden dva tri štyri päť "šesť sedem") má 6 prvkov. zoznam2=(${zoznam[@]} osem) má 8 (6 + 1 za rozdelenie + osem).
14 · Debug mód
Poznámky
set -x = zapne debug (pred každý vykonávaný príkaz vypíše +)set +x = vypne debug (mínus zapína a plus vypína, opačne, ako by si čakal)bash -x skript.sh = spustí celý skript v debug móde#!/bin/bash -x = debug pre celý skript priamo zo shebanguset -v = vypisuje riadky skriptu tak, ako ich bash číta- výpis debugu ide na stderr
set -e nie je debug, ale ukončenie skriptu pri prvej chybe
Príklady
$ cat pokus.sh
#!/bin/bash
a=5
echo "a je $a"
$ bash -x pokus.sh
+ a=5
+ echo 'a je 5'
a je 5
15 · Používatelia a /etc
Poznámky
whoami = moje meno, id = UID, GID a všetky skupiny, groups = skupiny/etc/passwd = čitateľný pre všetkých. Obsahuje meno, UID, GID primárnej skupiny, GECOS (celé meno, telefón…), domov a shell. Heslo je nahradené znakom x./etc/shadow = hashe hesiel, číta ho iba root/etc/group = skupiny a ich členovia/etc = konfiguračné súbory. Bežný používateľ by ich nemal meniť a reštart po zmene väčšinou netreba.scp jano@server:/cesta/subor . = skopíruje súbor zo servera (secure copy)
Príklady
$ id
uid=1000(jano) gid=1000(jano) groups=1000(jano),27(sudo)
$ grep jano /etc/passwd
jano:x:1000:1000:Jano,izba 12,0900123456:/home/jano:/bin/bash
$ cat /etc/shadow
cat: /etc/shadow: Permission denied