====== Esercitazione 2 ====== ===== Esercizio 0 : getting started===== Scrivere uno script bash //gettingStarted// che stampi il suo nome, il numero degli argomenti ed i primi tre argomenti (se esistono). Come bash:~$ ./gettingStarted mio tuo suo Script ./gettingStarted con 3 argomenti Primo parametro mio Scondo parametro tuo Terzo parametro suo Ciao Mondo bash:~$ ===== Esercizio 1: mycd ===== Scrivere una funzione Bash che implementa una versione personalizzata del builtin //cd// in cui prima viene eseguito il cambio di directory per mezzo del nomale builtin //cd// e poi viene eseguita una stampa formattata che ricorda la directory di partenza e quella di arrivo. Es: bash:~$ mycd PROVA mycd: successo! /home/s/susanna --> /home/s/susanna/PROVA bash:~/PROVA$ Se il cambio della working directory non ha successo //mycd// stampa il normale messaggio di errore del builtin //cd//. ===== Esercizio 2: mypushd & mypopd===== //pushd// e //popd// sono due builtin Bash che implementano uno stack di directory, Questo esercizio richiede di ri-implementarli tramite due funzioni: * //mypushd dir// che cambia la working directory in //dir// e la inserisce sullo stack di directory * //mypopd// che elimina la testa dello stack e si sposta nella nuova directory top ===== Esercizio 3: egunzip ===== Il comando //gunzip// solitamente si rifiuta di decomprimere file che non terminano per ".gz". Realizzare una funzione //egunzip// che accetta file con qualsiasi suffisso, aggiunge al nome (se non c'e' gia') il suffisso ".gz" ed invoca il normale //gunzip//. ===== Esercizio 4: chsfx, change suffix ===== Realizzare uno script Bash che realizza un comando di sintassi: chsfx [dir] old_suffix new_suffix che cambia il suffisso di tutti i file in //dir//che terminano per "old_suffix" in "new_suffix". Se //dir// non e' specificata ridenomina i file nella directory corrente. Infine, //chsfx// stampa uno per linea tutti i file modificati con il formato vecchio nome --> nuovo nome ===== Esercizio 5: mylsR -- recursive 'pretty' listing===== Realizzare una funziona Bash (ricorsiva!) che stampa in modo formattato il contenuto di tutto il sottoalbero radicato nella directory corrente: bash:~$ mylsR dir1 subdir11 file111 file112 subdir12 file121 file11 dir2 file21 file22 file1 file2 file3 in particolare il contenuto di ogni sottodirectory o file deve essere indentato di un TAB in piu' rispetto al padre. ===== Esercizio 6: checkAll -- uno script per automatizzare i test ===== Realizzare uno script Bash che prenda come argomento una directory e giri tutti i test contenuti nella directory confrontando l'output atteso (su stdout). Tutti i programmi di test terminano con il suffisso //".test"// mentre l'output atteso termina con il suffisso //".check"// ed ha la stessa radice. Ad esempio: bash:~$ ls dir primo.test primo.check zz.test zz.check nella directory //dir// sono presenti due programmi di test, uno chiamato //primo.test// che sia spetta come risultato sullo standard output il contenuto del file //primo.check// ed un secondo test //zz.test// che si aspetta come output sullo stdout il contenuto di //zz.check//. Lo script esegue tutti i test in ordine lessicografico, controlla che l'output sia quello atteso e stampa sullo standard error un messaggio per ogni test fornendo il nome del test effettuato e l'esito complessivo (OK, failed). Ad esempio: bash:~$ checkAll dir primo.test OK zz.test failed Includere opportuni controlli per verificare l'esistenza dei file, l'esito dei comandi etc.