Cvičení: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14.
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) | ########################