====== Esercitazioni 2/3 ====== ===== Esercizio 0: man, cat, grep, sort ===== Utilizzare ''cat'' per creare un file di nome ''lyrics'' che contiene la canzone del non compleanno di Alice nel Paese delle meraviglie: Statistics prove, prove that you've one birthday, one birthday ev'ry year. But there are three hundred and sixty four unbirthdays. That is why we're gathered here to cheer. A very merry unbirthday to you, to you. A very merry unbirthday to you, It's great to drink to someone and I guess that you will do. A very merry unbirthday to you con ''grep'' e ''sort'' selezionare tutte le linee che contengono esattamente la parola ''one'' (non come sottostringa di una parola data), ordinarle lessicograficamente e farle sampare sullo standard output (usare ''sort''). Utilizzare le opzioni di ''grep'' (vedi ''man grep'') per stampare il numero di linea in cui e' stata trovata un'occorrenza come in: 1:Statistics prove, prove that you've one birthday 2:one birthday ev'ry year. e poi sempre con ''grep'' stampare tutte le linee che non contengono la parola ''merry'' in ordine lessicografico case-unsensitive, cioe' : But there are three hundred and sixty four It's great to drink to someone and I guess that you will do. one birthday ev'ry year. Statistics prove, prove that you've one birthday, That is why we're gathered here to cheer. unbirthdays. Approfondimenti: * Usare ''fgrep'' invece di ''grep'' e confrontare il tempo impiegato dai due comandi in modalita' utente e kernel usando la ''time''. * Controllare le chiamate di sistema effettuate dai vari comandi con ''strace'' ===== Esercizio 1: Trasformismo ===== Trasformare il file ''lyrics'' dell'esercizio precedente nel file ''LYRICS'' in cui tutte le lettere minuscole sono state trasformate in lettere maiuscole. ===== Esercizio 2: Trovare i file non acceduti negli ultimi 30 giorni ===== Scrivere un pipeline di comandi che lista tutti i file che non sono stati acceduti negli ultimi 30 giorni nella gerarchia di directory radicata nella directory corrente. (Suggerimento: usare ''find'') ===== Esercizio 3: prettyPATH ===== Stampare su standard output tutte le directory in ''$PATH'' separate da newline. ===== Esercizio 4: Personalizzare il prompt ===== Personalizzare il prompt della shell in modo da stampare utente, tipi di shell, working directory etc.. (man bash, cercare PROMPTING) ===== Esercizio 5: Aliasing ===== Definire i seguenti alias per la propria shell: * ''cp'' come alias di ''cp -i'' * ''mv'' come alias di ''mv -i'' * ''rm'' come alias di ''rm -i'' * ''cercaErimuovi'' che effettua la rimozione di tutti i file che terminano per ~ nella gerarchia di directory radicata nella directory corrente * ''bye'' che effettua l'uscita dalla shell Fare in modo che gli alias vengano registrati automaticamente ogni volta che una shell viene attivata.(Suggerimento: ''man bash'' cercare ''bashrc'') ===== Esercizio 6: ???? ===== Sapete interpretare il risultato del seguente comando? ls -l /proc/$$/fd ===== Esercizio 7: Magic files and numbers ===== Utilizzare ''file'' per stabilire il tipo dei file che si trovano nella vostra home. ''file'' lavora controllando i magic numbers in ''/usr/share/file/magic'', esplorando questo file riuscite a ritrovare il tipo dei file visitati? Approfondimenti: Come si potrebbe aggiungere un nuovo tipo riconoscibile da ''file''? ===== Esercizio 8: Esecuzioni periodiche: il cron system ===== Utilizzare ''crontab'' per fare in modo di ricevere, una volta al minuto, una e-mail contenente la stringa "Pippo Pluto e Paperone ...". ''crontab'' permette di registrare dei comandi e delle periodicita' in un file (che chiameremo ''crontabFile'') e poi di registrare il file in modo che il cron system di Linux mandi in esecuzione il comando automaticamente agli istanti prefissati. Il ''crontabFile'' e' costituito da una sequenza di linee di sei campi minuti ore giorni mesi giorniDellaSettimana comando i primi 5 servono a specificare la periodicita' (0-59 per i minuti, 0-23 per le ore, 1-31 per i giorni, 1-12 per i mesi e 1-7 per i giorni della settimana) mentre il comando e' un qualsiasi comando unix. Ogni volta che il tempo corrente del sistema corrisponde a una richiesta di periodicita', il comando Unix viene eseguito e lo standard output del comando viene inviato all'utente che lo ha registrato, via e-mail. Se in un campo si specifica ''*'' il matching e' sempre verificato. Ad esempio: bash:~$ cat crontab.cron 0 8 * * 1 echo "Lunedi' mattina ore 8" * * * * * echo "E' passato un minuto" in questo caso il primo comando viene eseguito ogni lunedi' alle 8 mentre il secondo viene eseguito ogni minuto. Consultare man crontab per capire come effettuare la registrazione del confile. ===== Esercizio 9: Cron e segnali .... ===== Usare ''crontab'' e ''kill'' per inviare un segnale SIGUSR1 ogni minuto alla shell corrente ed usare ''trap'' per far stampare alla shell un breve messaggio ogni volta che riceve un segnale SIGUSR1. ''kill'' permette di inviare un segnale ad un processo di cui si conosce il pid. Usare ''ps'' o ''$$'' per ottenere il pid della shell corrente . ''trap'' invece permette di registrare un comando da effettuare all'arrivo di un segnale. ===== Esercizio 10: Rimozione periodica dei core file ===== Utilizzare ''crontab'' per rimuovere tutti i file di core di un determinato utente all'inizio di ogni giornata lavorativa. //Suggerimento:// Per non fare troppi danni, realizzare prima una versione che lista semplicemente i file da rimuovere senza cancellare niente. ===== Esercizio 11 : 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 12: 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 13: mygzip ===== //mygzip// e' uno script bash che prende come parametro una directory ed una lista di file bash:~$ mygzip dir file1 ... filek applica il comando ''gzip'' a tutti i file file1 ... filek presenti nella directory dir ===== Esercizio 14: dtar ===== Realizzare lo script //dtar// che con 0 o 1 parametri stampa il contenuto di PWD mentre con due parametri bash:~$ dtar dir file.tar copia il tarfile nella directory specificata e lo decomprime con il comando ''tar''. ===== Esercizio 15: modify ===== Realizzare uno script Bash che realizza un comando di sintassi: modify [dir] suffix che cambia il nome di tutti i file in //dir// aggiungendo un suffisso ''.suffix''. Se //dir// non e' specificata ridenomina i file nella directory corrente. Infine, //modify// stampa tutti i file modificati lasciando fra uno e l'altro una riga vuota file1.suffix file2.suffix .... ===== Esercizio 16: selectfile ===== Realizzare uno script Bash che selezioni tutti i file con un certo suffisso nella directory corrente, e presenti un menu in cui si richiede quale di questi file deve essere eseguito. Ad esempio: bash:~$ ls primo.test primo.check zz.test zz.check bash:~$ selectfile test 1) primo.test 2) zz.test Scelta?