Celem poniższej listy zadań jest zapoznanie się z mechanizmami shella uniksowego takimi jak: zmienne, wyrażenia warunkowe i pętle, operacje na wektorze argumentów. Postaraj się używać tylko programów wymienionych w zadaniu, i konstrukcji shella. W szczególności, postaraj się nie używać programów: grep, sed, awk, tr.

  1. (3 punkty) Napisz skrypt myls opakowujący wywołanie programu ls w taki sposób, żeby można mu było zadać nazwę pliku bez końcówki, np. można było pisać `myls main' zamiast `ls main.c'. Skrypt powinien najpierw sprawdzić, czy istnieje plik dokładnie o podanej nazwie, i jeśli tak, to wywołać program ls z nim bezpośrednio.

    Gdyby plik nie istniał, skrypt powinien próbować uzupełnić jego nazwę kolejno o końcówki z predefiniowanej listy EXTENSIONS=".c .java .html", i jeśli któraś dopasuje się do istniejącego pliku, wywołać ls z odpowiednio uzupełnioną nazwą.

    W żadnym przypadku nie należy wywoływać ls z nazwą nieistniejącego pliku. Dołącz opracowany skrypt do raportu z zadania.

  2. (3 punkty) Napisz skrypt, przetwarzający dowolnie długą listę argumentów, traktowanych jako nazwy plików (z bezwzględną lub względną ścieżką katalogów), w następujący sposób. Dla pierwszego argumentu program powinien wyświetlić dwa słowa: nazwę katalogu i nazwę pliku bez ścieżki katalogów (użyj programów dirname i basename). Dla kolejnych plików, o ile ich ścieżka katalogów jest identyczna do poprzedniego pliku, skrypt wyświetla w tym samym wierszu tylko nazwę pliku bez ścieżki, a jeśli ścieżka się różni od poprzedniego pliku, to od nowego wiersza wyświetla znów ścieżkę katalogów oraz nazwę pliku. Na przykład, dla wektora argumentów:
    *.c /etc/passwd /etc/shadow
    
    powinniśmy otrzymać wynik podobny do następującego:
    . fun1.c fun2.c main.c
    /etc passwd shadow
    

    Dołącz opracowany skrypt do raportu z zadania.

  3. (3 punkty) W tym zadaniu należy zbudować skrypt nieco podobny w działaniu do uniksowego programu `make'. Najpierw wybierz dowolny program „kompilacji” pliku źródłowego do wynikowego. Na przykład, javac tworzy plik .class ze źródłowego .java, `cc -c' tworzy plik wynikowy .o ze źródłowego .c, albo, dla odmiany, pdflatex tworzy wynikowy .pdf ze źródłowego .tex.

    Następnie napisz skrypt, który otrzymawszy jako argument nazwę pliku źródłowego, rozpocznie powtarzalnie, w nieskończonej pętli, obserwację odpowiedniego pliku wynikowego, i ilekroć okaże się, że plik źródłowy został wygenerowany później, wykona kompilację. Pętla powinna zawierać małe, np. 1-sekundowe opóźnienie, aby nie obciążać zbytnio systemu gdy nic się nie dzieje. Do porównania plików wykorzystaj opcję -nt/-ot testa.

    Efekt powinien być taki, że po uruchomieniu skryptu w temrinalu, wystarczy w edytorze okresowo zachować nową wersję pliku źródłowego, by kompilacja została przeprowadzona automatycznie z niewielkim opóźnieniem.

    Dołącz opracowany skrypt do raportu z zadania.

    Uwaga: jeśli spodoba Ci się to narzędzie i chciałbyś/chciałabyś używać go w praktyce, to warto poszukać na komputerze programu generującego krótkie sygnały dźwiękowe, i dodać na zakończenie kompilacji dźwiękowe potwierdzenie wyniku. Np. krótki cichy dźwięk jeśli kompilacja była poprawna, i głośniejszy, ostry dźwięk, gdy wygnerowała błędy. Wtedy uruchomiony skrypt kompilacji można zminimalizować, by nie zajmował miejsca na ekranie. W braku innych dźwięków, można wykorzystać dzwonek terminala tekstowego (tput bel).