Cvičení: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14.

Čtení před cvičením

Pro toto cvičení není nic nového na čtení.

Místo toho, zopakujte, co jsme dosud dělali. Kvíz se také týká především známých témat plus vyžaduje trochu čtení manuálových stránek.

Kvíz před cvičením

Soubor s kvízem je ve složce 06 v tomto GitLabím projektu.

Zkopírujte si správnou jazykovou mutaci do vašeho projektu jako 06/before.md (tj. budete muset soubor přejmenovat).

Otázky i prostor pro odpovědi jsou v souboru, odpovědi vyplňte mezi značky **[A1]** a **[/A1]**.

Pipeline before-06 na GitLabu zkontroluje, že jste odevzdali odpovědi ve správném formátu. Ze zřejmých důvodů nemůže zkontrolovat skutečnou správnost.

Odevzdejte kvízy před začátkem cvičení 06.

Učební výstupy jsou popsány v předchozím cvičení.

Hodnocené úlohy (deadline: 3. dubna)

Tyto úlohy jsou sdílené pro 05 a 06.

06/dir.sh (30 bodů)

Napište skript pro výpis velikosti souborů.

Skript bude částečně imitovat chování ls: bez argumentů vypíše informace o souborech v aktuálním adresáři, argumenty bude brát jako seznam souborů, o kterých má zjišťovat více.

Příklad spuštění může vypadat takto:

./06/dir.sh /dev/random 06/dir.sh 06
/dev/random  <special>
06/dir.sh          312
06               <dir>

Druhý sloupeček zobrazí velikost souboru pro normální soubory, <dir> pro adresáře a <special> pro jiné soubory. Velikost souboru lze získat třeba pomocí programu stat(1).

Neexistující soubory budou hlášeny jako SOUBOR: no such file or directory. na stderr.

Můžete předpokládat, že máte přístup ke všem souborům vyjmenovaným na příkazové řádce.

Asi se vám bude hodit prográmek column, především následující spuštění:

column --table --table-noheadings --table-columns FILENAME,SIZE --table-right SIZE

Můžete také předpokládat, že názvy souborů budou rozumné (bez mezer). Pro zjednodušení nebudeme kontrolovat, že návratový kód je nenulový, pokud některý soubor neexistuje.

06/scoring.sh (50 bodů)

Napište skript, který sečte body z turnaje.

Skript čte ze standardního vstupu jednoduchý textový formát, kde každá řádka má dvě pole (oddělená prázdnými znaky): identifikátor (id) týmu a počet bodů.

Po přečtení dat skript vypíše součet bodů pro každý tým v passwd formátu (pole oddělená dvojtečkou).

Příklad spuštění může vypadat takto:

alpha    5
charlie  8
bravo   10
alpha    7
bravo    2
bravo    3

Výstup:

alpha:12
bravo:15
charlie:8

Očekáváme, že budete používat dočasné soubory pro ukládání bodů pro každý tým. Použijte mktemp a odstraňte dočasné soubory po ukončení skriptu.

Můžete předpokládat, že id týmu jsou rozumná a použít je jako názvy souborů (tj. žádné mezery, lomítka, dvojtečky apod.).

06/sysinfo.sh (50 bodů)

Napište skript, který vypíše následující informace:

  • současnou zátěž (load) systému (koukněte na /proc/loadavg)
  • současnou verzi kernelu (uname -r)
  • počet procesorů (nproc)

Naše testy očekávají, že použijte programy/soubory uvedené výše. Ostatní příkazy nejsou imitované a testy nebudou fungovat.

Když je program spuštěn bez argumentů, vytiskne informace v následujícím formátu.

load=0.05 kernel=5.15.fc34.x86_64 cpus=12

Pokud je program spuštěn s libovolnou s následujících voleb, vytiskne jen relevantní část výstupu:

  • -l nebo --load pro load systému
  • -k nebo --kernel pro verzi kernelu
  • -c nebo --cpus pro počet procesorů

Spuštění s -h nebo --help vytiskne krátkou nápovědu (využijte testy pro zjištění přesného formátu).

Přidání -s nebo --script způsobí, že jednotlivé hodnoty budou vytištěny po jedné na každém řádku.

Příklady

$ 05/sysinfo.sh
load=0.05 kernel=5.15.fc34.x86_64 cpus=12
$ 05/sysinfo.sh -k --load
load=0.06 kernel=5.15.fc34.x86_64
$ 05/sysinfo.sh --script
load=0.12
kernel=5.15.fc34.x86_64
cpus=12
$ 05/sysinfo.sh -s -c
cpus=12

06/plot.sh (70 bodů)

Napište shellový skript pro kreslené sloupcového (řádkového) grafu. Uživatel zadá data v následujícím formátu:

12  First label
120 Second label
1 Third label

Skript vytiskne pak takovýhle graf:

First label (12)   | #
Second label (120) | #######
Third label (1)    |

Skript dostane soubor s daty jako první argument a šířku určí podle velikosti obrazovky. Také zarovná popisky jak je vidět v grafu výše.

Můžete předpokládat, že vstupní soubor bude vždy existovat a můžete ho několikrát číst. Žádné další argumenty není třeba řešit.

Nápověda

Šířka obrazovky je uložena v proměnné $COLUMNS. Předpokládejte hodnotu 80 pokud není nastavena. (Můžete předpokládat, že bude buď prázdná (nenastavená) nebo bude obsahovat platné číslo).

Graf bude nakreslen tak, aby vyplnil celou šířku obrazovky (tj. zvětšen/zmenšen).

Můžete slít více mezer do jedné (i pro popisky), první a druhý sloupeček je oddělen mezerou (mezerami).

Podívejte se, co dělá wc -L.

Všimněte si, že první testy používají popisky stejné délky, abyste mohli lépe odstartovat vaši implementaci.

Zvažte použití printf pro tištění zarovnaných popisků.

Následující zajistí, že bc bude počítat s racionálními čísly ale zobrazí výsledek jako integer (což se hodí pro složitější shellové výpočty).

echo 'scale=0; (5 * 2.45) / 1' | bc -l

Příklady

2 Alpha
4 Bravo
# COLUMNS=20
Alpha (2) | ####
Bravo (4) | ########
2 Alpha
4 Bravo
16 Delta
# COLUMNS=37
Alpha (2)  | ###
Bravo (4)  | ######
Delta (16) | ########################