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 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.
- (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.
- (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.
- (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.
- (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.
- (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:
- zalogowania się do systemu przez xdm (X Windows),
- zalogowania się do systemu przez ssh (w okienku terminala),
- wywołania wewnętrznego interpretera z jakiegoś innego programu,
np. z menu aplikacji zarządcy okien (w braku takiej możliwości
wywołaj w bashu zsh, a w zsh znowu basha).
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ć.