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. (1 punkt) Napisz skrypt, który poleceniem `date' będzie wyświetlał aktualną godzinę co określony czas, na przemian z wywoływaniem polecenia `clear'. Opcjonalny parametr skryptu powinien pozwalać zadać okres odświeżania wyświetlanego czasu, w sekundach (domyślnie co 10 sekund).

    Opcjonalne: jeśli potrafisz, to wymuś, by okresowo wyświetlany czas był wielokrotnością 10 sekund, tzn. by wyświetlał się tylko czas :10, :20, itp., a nie np. :13, :23, itp.

  2. (3 punkty) Napisz skrypt o nazwie `tdir', który wywoła polecenie `ls' z opcjami -l i -t, plus całym wektorem argumentów skryptu. Dodatkowo, wyjście `ls' w skrypcie powinno być skierowane przez potok do polecenia `less'. Celem jest wygodne przeglądanie katalogów posortowanych po dacie ostatniego zapisu do pliku, ze stronicowaniem przez `less'.

    Przetestuj wywołanie skryptu zadając mu jako argumenty różne parametry opcjonalne `ls' (np. -a, -i, -F albo -R), a także różne nazwy plików i katalogów (w tym nazwy plików zawierających spacje).

    Upewniwszy się, że skrypt działa poprawnie, i pozwala na wszystkie możliwości wywołania `ls', uporządkuj go, i zminimalizuj, aby wyglądał wzorcowo.

  3. (1 punkt) Napisz skrypt, podobny do prezentowanego na wykładzie, który policzy i zaraportuje liczbę plików w katalogu bieżącym, lub w katalogu podanym jako argument (jeśli jest argument). Jeśli argumentów wywołania jest więcej niż jeden, to należy policzyć i podać liczby plików oddzielnie dla każdego podanego katalogu.

    Chcemy również, by skrypt akceptował argument opcjonalny -a podobnie jak program ls. To znaczy, z argumentem -a obliczy liczby wszystkich plików, włącznie z plikami „ukrytymi” (o nazwach zaczynających się od kropki), a bez -a aby te pliki pomijał.

    Zwróć uwagę na możliwość występowania plików o nazwach zawierających spacje. Czy Twój skrypt prawidłowo je oblicza? A pliki ze znakiem NEWLINE w nazwie? Odpowiedz w raporcie na te pytania.

  4. (3 punkty) Napisz skrypt, do odpytywania użytkownika o wartości kilku parametrów. W pliku o nazwie zadanej pierwszym argumentem wywołania mamy szereg par „argument wartość” o postaci:
    pi 3.14
    e 2.72
    g 9.81
    c
    
    Skrypt powinien zapytać użytkownika o każdą z tych zmiennych, oferując możliwość zaakceptowania wartości domyślnej (przez naciśnięcie ENTER), podobnie jak skrypt odpytaj_kolor.sh prezentowany na wykładzie.

    Wynik pracy, w postaci nowego kompletu par „argument wartość” (z wartościami podanymi przez użytkownika) skrypt powinien zapisać na nowym pliku, o nazwie zadanej drugim argumentem wywołania.

    Zwróć uwagę, że źródłowy plik może nie mieć wartości dla niektórych zmiennych, jak w powyższym przykładzie. Wtedy skrypt powinien przedstawić tę sytuację użytkownikowi (w postaci pustej wartości domyślnej), jednak w przypadku gdyby ten nie wpisał nowej wartości, w~pliku wynikowym powinna zostać wpisana wartość (napis): NIEZNANA.

    Wskazówka: na wykładzie była omawiana konstrukcja do wygodnego odpytywania użytkownika o wartość zmiennej, z podpowiedzią wartości domyślnej. Tę konstrukcję można tu wykorzystać, wbudowując ją w pętlę, czytającą kolejne pary z pliku. Należy tylko zbudować poprawne wyrażenie stopu pętli, gdy nie da się już przeczytać kolejnej zmiennej.

    OPCJONALNE (dla ambitnych): dodaj możliwość, żeby skrypt mógł być wywołany bez żadnych argumentów. Wtedy powinien oczekiwać na sekwencję par „argument wartość” z wejścia (stdin) a wyniki wypisywać na wyjściu (stdout). Oczywiście takie wywołanie ma sens tylko z przekierowaniem wejścia i wyjścia wywołanego skryptu, tak jak zostało to pokazane w przykładach z wykładu.

    Sztuka nie polega na tym, by zduplikować treść skryptu i podzielić na dwa warianty, ale aby ta możliwość była opcją nałożoną na to samo wyrażenie. To znaczy, aby skierowanie z i do pliku stało się opcjonalne, i w razie braku plików znikało. Gdy nie ma skierowań, czytanie i pisanie następuje automatycznie z stdin i na stdout.

    Dołącz opracowany skrypt do raportu z zadania.

  5. (3 punkty)

    Wybierz jakieś często używane polecenie (np. ls, albo ps, albo who), oraz najczęściej używane argumenty (opcje). Zdefiniuj jeden lub kilka aliasów basha poleceniem alias. Sprawdź wprowadzoną już definicję poleceniem alias (bez argumentów). Przetestuj jej działanie w różnych sytuacjach, w szczególności przetestuj jak działa z różnymi zestawami opcji/argumentów, zarówno uzupełniających te zawarte w aliasie, jak i zmieniające je.

    Następnie spróbuj zdefiniować wcześniej napisany skrypt tdir jako funkcję (niestety, w bashu nie da się jej zdefiniować jako aliasa).

    Opracowane definicje aliasów i funkcji wklej do raportu z wykonania zadania.

  6. (2 punkty) Zlokalizuj pliki inicjalizacyjne w Twoim katalogu domowym, z których bash czyta swoją konfigurację startową (.bash_profile, .bashrc oraz inne, patrz część INVOCATION dokumentacji basha).

    Utwórz podkatalog o nazwie Bin w Twoim katalogu domowym, typowo przeznaczone do umieszczania prywatnych skryptów i programów użytkownika. Napisz wyrażenie dopisujące ten katalog do ścieżki PATH. Ważne: nie nadpisuj oryginalnej wartości PATH - powinna ona być prawidłowo (standardowo) skonfigurowana przez administratora systemu dla danej instalacji. Prywatny katalog Bin może być dopisany na koniec lub na początek ścieżki PATH (która możliwość wydaje Ci się lepsza?).

    Wpisz do odpowiedniego/odpowiednich plików startowych basha wyrażenie przedefiniowania ścieżki PATH, a także definicje aliasów i funkcji opracowanych we wcześniejszym punkcie.

    Sprawdź eksperymentalnie, że wszystkie definicje (modyfikacja PATH, aliasy i funkcje) działają poprawnie w następujących sytuacjach:

    W szczególności, upewnij się, że definicje nie są wywoływane wielokrotnie (np. ścieżka PATH nie przyrasta o wielokrotnie dopisane Bin).

    W raporcie z wykonanego zadania podaj swoje indywidualne wpisy wykonane w poszczególnych plikach inicjalizacyjnych. Jeśli masz jeszcze jakieś indywidualne definicje w bashu, to możesz również je podać.