A4B33OSS: Semestrální práce A1-A5

Implementace skriptu v jazyce Bash

Úlohy řeší každý student samostatně. Řešení úlohy odevzdáváte přes odevzdávací systém, který ji automaticky zkontroluje. Pokud systém vaší úlohu nepřijme, důkladně si prostudujte výsledek testu.

Úloha A1

Vytvořte skript, který:

  1. vytvoří v adresáři /tmp podadresář s názvem osdtask,
  2. v adresáři /tmp/osdtask vytvoří soubor s názvem rootdir.txt, jehož obsahem bude seznam všech souborů a adresářů kořenového adresáře (bez skrytých souborů),
  3. nastavte práva k tomuto souboru tak, aby vlastník a skupina mohli číst a zapisovat, ale ostatní nic,
  4. vytvořte v adresáři /tmp/osdtask symbolický odkaz na soubor rootdir.txt s názvem odkaz.txt tak, aby byl odkaz relativní (tzn. byl platný, pokud je odkaz i odkazovaný soubor přesunut do jiného adresáře),
  5. v adresáři /tmp smažte podadresář s názvem smazat, přičemž předpokládejte, že tento adresář není prázdný a
  6. vypište na chybový výstup text "DONE".
Váš program by kromě posledního bodu neměl generovat žádné výstupy.

Nápověda: viz příkazy man, echo, cd, mkdir, ls, ln a rm.

UPOZORNĚNÍ: pokud úlohu ladíte na veřejném počítači (obzvlášťě serveru), uklízejte po sobě prosím důsledně veškeré soubory a adresáře vytvořené ve složce /tmp.


Úloha A2

Vytvořte skript, který:

  1. vypíše svůj vlastní název bez cesty na standardní výstup,
  2. vypíše cestu k aktuálnímu pracovnímu adresáři,
  3. vypíše prázdný řádek,
  4. vypíše svůj první argument na standardní výstup,
  5. vypíše na chybový výstup seznam všech souborů a podadresářů (ne-rekurzivně!) z adresáře, který je zadán jako druhý argument skriptu a které ve svém názvu obsahují řetězec, zadaný jako první argument skriptu
  6. spustí příkaz /bin/uname -a a načte jeho výstup do proměnné; poté spustí program /tmp/osdwrite a hodnotu této proměnné mu předá jako argument.
Pro účely testování si můžete /tmp/osdwrite vytvořit jako prázdný skript na vašem počítači. Každý výstup programu je na samostatném řádku, kromě požadovaných výstupů váš skript nevypisuje nic jiného.
Předpokládejte, že oba očekávané argumenty budou vždy zadány.

Př.: Výstup vašeho skriptu: (pouze standardní výstup)

uloha2.sh
/home/student/novak01/work

bin (hodnota prvního argumentu)
<případný výstup programu /tmp/osdwrite>

Chybový výstup vašeho skriptu spuštěného s parametry 'bin' a '/':

bin
sbin

Nápověda: viz příkazy basename, grep.


Úloha A3

Vytvořte skript, který:

  1. otestuje, má-li zadán alespoň 1 argument. Pokud ne, vypíše hlášení "CHYBA1" na chybový výstup a skončí s návratovou hodnotou 1.
  2. Zkontroluje, zda je první argument skriptu existující obyčejný soubor a zda k němu máte právo zápisu. Pokud ne, vypíše hlášení "CHYBA2" na chybový výstup a skončí s návratovou hodnotou 2.
  3. Vypište počet řádek souboru zadaného jako první argument.
  4. Je-li zadán 2. argument skriptu, zjistěte, zda je spuštěn proces se shodným názvem, jako je tento argument.
  5. Pokud takový proces běží, vypište jeho PID a pošlete mu signál 15 (SIGTERM). V opačném případě vypište hlášení "CHYBA3" na chybový výstup.

Př.: Výstup vašeho skriptu:

7
1587

Nápověda: viz příkazy wc, ps, cut, kill.


Úloha A4

Vytvořte skript, který bude číst standardní vstup řádek po řádku. Pro každý načtený řádek zavolejte funkci s názvem "typsouboru" (načtený řádek je předán jako jediný argument), která provede následující operace:

  1. jedná-li se o název platného adresáře (relativní nebo absolutní cestu), vypíše na standardní výstup "DIR <cesta_k_adresáři>" (cestu vypisujte tak, jak ji dostanete zadanou!),
  2. jedná-li se o název existujícího souboru (libovolného typu, včetně symlinků), vypíše na standardní výstup "FILE <cesta_k_souboru>",
  3. ve všech ostatních případech vypište "INVALID <přečtený_řádek> na chybový výstup.
  4. Návratová hodnota funkce je 0, jedná-li se o platný soubor či adresář, jinak 1.
Pokud byl vypsán alespoň jeden "INVALID" řádek, vypíše se na konci na chybový výstup řádek "# ERRORS", kde # je počet chybných řádků. V opačném případě (vše v pořádku) se nevypíše nic.

Př.: Výstup vašeho skriptu: (červené řádky jsou chybový výstup)

DIR /bin
FILE /bin/bash
INVALID /bin/bin
DIR /tmp
INVALID /tmp/soubor
FILE /etc/passwd
2 ERRORS

Nápověda: viz příkaz read.


Úloha A5

Vytvořte skript, který zpracuje html stránku a najde v ní odkazy na PDF soubory. HTML stránku se nepokoušejte stahovat (!) obsah stánky přečtěte ze standardního vstupu. Váš skript

  1. Načte stránku ze svého standardního vstupu,
  2. nalezne v obsahu všechny odkazy na PDF soubory (poznáte je podle přípony .pdf - bez ohledu na velikost písmen) a
  3. pro každý nalezený odkaz vypíše na standardní výstup jeho plnou URL adresu.
Skriptu bude navíc jako parametr předána URL adresa stránky (předpokládejte, že URL je včetně souboru stránky, např. index.html). Tuto informaci využijte v případě, že URL adresa PDF souboru je vypsána relativně.
Případné chybné použití skriptu vypisujte na chybový výstup. Dále můžete chybový výstup používat dle potřeby pro ladící výpisy.

Pro zjednodušení můžete předpokládat, že na jednom řádku html stránky bude maximálně jeden odkaz na PDF soubor, a že celý tag <a > ... </a> není rozdělen na více řádků.
URL odkazovaných souborů budou vždy uváděny buď absolutně (včetně "http://"), nebo relativně k URL stránky.

Př.: Výstup vašeho skriptu: (červené řádky jsou chybový výstup)

http://muj.server.cz/prednaska01.pdf
http://muj.server.cz/prednaska02.pdf
http://muj.server.cz/prednaska03.pdf
http://muj.server.cz/cviceni/cviceni.pdf

Nápověda: viz příkaz sed, grep.



Poslední změna: 19.9.2014                                        webmaster:
stepan-AT-labe.felk.cvut.cz