Appunti del Corso di Sistemi Operativi - A. A. 2011-12 Universit del Salento
Luca Marzo luca.marzo@live.com
2 0 1 2
2 Introduzione Questi appunti nascono dallesigenza di avere uno strumento unitario che raccogliesse tutti i comandi visti nel corso delle lezioni tenute dal Prof. Franco Tommasi della Facolt di Ingegneria, Universit del Salento. Lungi dal sostituire un libro di testo, queste pagine hanno lunico scopo di fornire un rapido supporto per lutilizzo di una serie di comandi per il terminale di Mac OS X e GNU/Linux.
Ringraziamenti doveroso, a conclusione di questo lavoro di stesura di appunti ringraziare (in ordine sparso) le persone che, a vario titolo, hanno contribuito alla correzione ed al miglioramento degli appunti. Prof. Franco Tommasi Giampiero DAutilia Luca De Pandis Simone Laierno Arianna Lever Giorgia Indraccolo Alessia Cortese Eugenia Longhin Erica Marzo
Note e correzioni Sono graditi suggerimenti e correzioni da inviare allindirizzo di posta luca.marzo@live.com Questi appunti sono distribuiti liberamente e sono scaricabili dal seguente link: http://dl.dropbox.com/u/49017444/os.pdf Gli script creati a lezione sono disponibili al seguente link: http://dl.dropbox.com/u/49017444/os-script.zip
3 Sistemi Operativi Comando Descrizione cd / Cambia Directory -> Root ls -la Vedi cartelle e file presenti nella cartella corrente ed i relativi dettagli cd Cambia directory (Specificare la cartella di destinazione)
Cartella Sistema Operativo Descrizione Volumes MacOS X Mostra tutti i volumi montati sulla macchina in uso bin MacOS X - GNU/Linux Utility di sistema che non richiedono privilegi particolari etc MacOS X - GNU/Linux Contiene file di configurazione della macchina tmp MacOS X - GNU/Linux Cartella di file temporanei usr MacOS X - GNU/Linux Contiene tutti i file/utility necessarie all'utente/i in modalit multiuser sbin MacOS X - GNU/Linux Utility di sistema che richiedono privilegi dev MacOS X - GNU/Linux var MacOS X - GNU/Linux Contiene file soggetti a variazioni (es. logs)
Cartella Sistema Operativo Descrizione tmp GNU/Linux File temporanei home GNU/Linux Directory in cui vengono piazzate le directory degli utenti LOCALI residenti nel sistema. presente nella stragrande maggioranza dei sistemi Unix-like e UNIX. In Mac OS X, il suo ruolo sostituito da /Users. usr GNU/Linux Contiene tutti i file/utility necessarie all'utente/i in modalit multiuser var GNU/Linux Contiene file soggetti a variazioni (es. logs) sbin GNU/Linux Utility di sistema che richiedono privilegi media GNU/Linux Volumi esterni mnt
Si consiglia la consultazione della seguente pagina di manuale relativa alla descrizione della gerarchia del file system: http://www.kernel.org/doc/man-pages/online/pages/man7/hier.7.html
Comando Descrizione ssh nomeutente@dominio.tld Connetti ad una sessione SSH (Secure Shell) clear Pulisci la schermata del terminale who Restituisce a video tutti gli utenti connessi attualmente alla macchina whoami Restituisce il nome utente dellutente attualmente connesso al sistema exit Disconnessione
4
Combinazione da tastiera Comando UNIX CTRL+C Chiudi la linea di comando (End-Of-Text Character) CTRL+D Termina (End-Of-Transmission Character) CTRL+A Torna ad inizio riga CTRL+E Vai a fine riga TAB Autocompletamento S Salva F5 Tilde ~ (Option+F5)
Scorciatoie da tastiera MacOS X: http://support.apple.com/kb/ht1343?viewlocale=it_it&locale=it_it Comandi comuni Unix: http://www.ensyncsolutions.com/library/unix_commands.pdf
Tabella delle ridirezioni:
5
Comando Descrizione mkdir nomecartella Crea una cartella di nome nomecartella rmdir nomecartella Elimina la cartella di nome nomecartella touch nomefile Crea un file vuoto di nome nomefile rm nomefile Elimina il file di nome nomefile mv 1 file1 file2 Rinomina/Sposta il file sorgente nel file di destinazione, se il file di destinazione esiste, sar sovrascritto. ls nomefile Informazioni sul file ls -la nomefile Informazioni dettagliate sul file indicato ls -la ../nomefile Verifica lesistenza 2 del file nomefile nella cartella parent 3
e fornise informazioni dettagliate su di esso. pwd Visualizza la cartella di lavoro corrente mv nomefile ../nomefile Sposta il file nomefile nella cartella parent mv ../nomefile . Sposta il file nomefile dalla cartella parent alla cartella attuale cp file1 file2 Copia file1 in file2 4
history Visualizza lelenco dei comandi utilizzati (storico) !155 Esegui il comando n155 dalla cronologia dei comandi utilizzati. echo testo Ripete ci che scritto dopo, ad esempio testo
Attenzione! Per inserire uno spazio nel nome di un file necessario inserire un simbolo di backslash \ prima dello spazio: es. nome\ del\ file
1 Comando Move - http://man.cx/mv 2 Esiste un comando specifico per verificare lesistenza di un file: test(1). Es: [ -e ../file ] - http://man.cx/test 3 Parent: cartella di livello superiore alla cartella corrente. 4 Fare riferimento alla relativa pagina di manuale - http://man.cx/cp
6 Permessi Ogni file ha un set di privilegi/permessi e sono elencati nelle prime 10 colonne delloutput del comando ls -la d r w x r - x r - x Tipo File Lettura Scrittura Esecuzione Lettura Scrittura Esecuzione Lettura Scrittura Esecuzione Permessi Owner Permessi Gruppo Permessi Utente
Mnemonicamente utile lacronimo UGO (User - Group - Others) Nella prima colonna si possono trovare i seguenti valori: Valore Descrizione d Directory (Cartella) - File regolare
Le altre colonne possono riportare i seguenti valori: Valore Descrizione r Lettura w Scrittura x Esecuzione - Nessun permesso
Permessi in formato Ottale I permessi possono essere espressi anche in formato ottale, segue uno schema:
Valore Ottale Descrizione r 4 Lettura w 2 Scrittura x 1 Esecuzione
In questo sistema, la combinazione di permessi r+w+x uguale a 4+2+1 = 7, di conseguenza il 7 corrisponde ai massimi privilegi sul file. Utilizzando il sistema ottale, i 9 valori relativi ai privilegi sul file, si riducono a soli 3 valori: 7 7 7 Owner Gruppo Utente
I tre valori utilizzati nel sistema ottale possono essere sommati tra di loro e di conseguenza generare differenti combinazioni corrispondenti ad una determinata tipologia di permessi: Il valore 3, corrisponde alla combinazione wx, cio il risultato della somma di "1+2", in questo modo si assegnano i permessi di esecuzione e scrittura. La cifra 5, corrisponde alla combinazione rx, cio il risultato della somma di "1+4", in questo modo si assegnano i permessi di esecuzione e lettura. La cifra 6, corrisponde alla combinazione rw, cio il risultato della somma di "2+4", in questo modo si assegnano i permessi di scrittura e lettura. La cifra 7, corrisponde alla combinazione rwx, cio il risultato della somma di "1+2+4", in questo modo si assegnano i permessi di esecuzione, scrittura e lettura.
7 Assegnare/Modificare i privilegi di un file Comando Descrizione chmod 5 permessi nomefile Assegna i permessi al file o alla directory indicata chmod g+w nomefile Assegna i permessi di scrittura al gruppo per il file indicato chmod g-rw nomefile Elimina i permessi di scrittura e lettura al gruppo per il file chmod 770 nomefile Assegna i permessi completi al file per owner e gruppo, nessun permesso agli altri. chown 6 newowner file Cambia il proprietario del file in newowner chgrp 7 newgroup file Cambia il gruppo per il file in newgroup
Comando Descrizione edit nomefile Apri il file nomefile in modalit modifica con TextWrangler (MacOS) nano nomefile Modifica il file nomefile da terminale con leditor Nano (GNU/Linux) which nomecomando Visualizza a schermo il file (ed il path) che eseguo quando utilizziamo il comando nomecomando
Utilizzo del manuale
Comando Descrizione man nomecomando Apre la pagina di manuale relativa al comando nomecomando man cp Apre la pagina di manuale relativa al comando cp BARRA SPAZIATRICE Avanza di una schermata nel manuale B Torna indietro Q Chiudi il manuale e ritorna al terminale /read Cerca read nel manuale
Comando Descrizione wc nomefile Conta le righe, le parole ed i caratteri presenti nel file nomefile 8
wc stdin 9 + CTRL+D Accetta input dallo stdin fino al comando CTRL+D cat nomefile Visualizza nel terminale il contenuto del file nomefile cat stdin + CTRL+D Accetta input dallo stdin fino al comando CTRL+D > Ridirigi lo stdout 10
< Ridirigi lo stdin | Il carattere pipe (tubo) mette in comunicazione lo stdout di un comando allo stdin di un altro comando.
Alcuni esempi di utilizzo di comandi concatenati con il pipe
Comando Descrizione ls -la | wc Manda in input al comando wc loutput del comando ls -la rev Rovescia ogni riga che gli viene fornita come input
5 Comando chmod: Change the File Mode - http://man.cx/chmod 6 Comando chown: Change the File Ownership - http://man.cx/chown 7 Comando chgrp: Change the File Group Ownership - http://man.cx/chgrp 8 Comando wc: Word, Line and Byte or Character Counter - http://man.cx/wc 9 Stdin: Standard Input, in generale la tastiera 10 Stdout: Standard Output, in generale il terminale, lo schermo
8 ls -la | rev Prende in input e rovescia loutput del comando ls -la ls -la | rev | edit Prende in input e rovescia loutput del comando ls -la ed apre TextWrangler con quellinput. ls -la | rev | sort Prende in input e rovescia loutput del comando ls -la ed ordina loutput comando >> 11 nomefile Aggiungi loutput di un comando ad un file nomefile gi esistente history >> nomefile Salva la cronologia dei comandi in un file dal nome nomefile uniq Elimina dal file di input righe adiacenti uguali 12
cut 13 Taglia i campi selezionati da ogni riga dellinput ls -la | cut -c1-10 Taglia dallinput le prime 10 colonne ls -la | cut -c1-5, 10-15 Taglia dallinput le prime 5 colonne e le colonne dalla 10 alla 15 grep pattern file Filtra una stringa pattern allinterno di un file cat nomefile.txt | grep wc Cerca wc nel file nomefile.txt
Script possibile creare degli script personalizzati che eseguano un set di comandi quando sono lanciati. Ogni script inizia con la cosiddetta riga dello Shebang 14 che indica al terminale di eseguire lo script con bash 15 . La riga dello shebang si compone come segue:
#!/bin/bash
Cio dai caratteri #! e dal percorso dellinterprete (in questo caso bash) che deve eseguire lo script. Il carattere # posto allinizio di una riga dello script indica che tale riga costituisce un commento, pertanto essa non viene eseguita dallinterprete.
Prima di eseguire uno script, necessario renderlo eseguibile assegnando i privilegi di esecuzione con lapposito comando chmod:
chmod 700 nomescript # assegno i permessi di esecuzione esclusivamente allowner del file
Per eseguire lo script, supponendo che si trovi nella cartella di corrente 16 scriviamo nel terminale il seguente comando:
./nomescript
$PATH una variabile dambiente tipica dei sistemi operativi Unix che specifica un insieme di directory che contengono i programmi eseguibili. Generalmente tali percorsi sono:
/bin /usr/bin /usr/local/bin
Per visualizzare il valore della variabile sul sistema in uso, digitare:
echo $PATH
11 Append ( >> ): aggiunge contenuto ad un file esistente 12 Si consiglia di lavorare su file gi ordinati mediante il comando sort 13 Comando Cut - http://man.cx/cut 14 Shebang: http://en.wikipedia.org/wiki/Shebang_(Unix) 15 Bourne Again Shell: shell testuale del progetto GNU usata nei sistemi operativi Unix e Unix-like 16 Per verificare la cartella di lavoro corrente (Current Working Directory) utilizzare il comando pwd
9 Linsieme delle variabili predefinite nella macchina in uso visibile utilizzando il comando seguente:
env 17
Comando Descrizione a=34 Dichiara una variabile a 18 assegnandole il valore 34 echo $a Visualizza il valore della variabile a echo $((4*67)) Stampa una stringa contenente loutput di un comando echo !! Sostituisce lultimo comando c=$((4*67)) Assegna il risultato delloperazione alla variabile c c=$(4*67) Assegna la stringa alla variabile c
Per copiare un file da una macchina allaltra, eseguire il comando scp 19 :
scp nomefile utente@dominio.tld:cartella
Il comando scp utilizza ssh per copiare il file dal computer in uso ad un altro computer remoto.
Per creare un file contenente informazioni sugli utenti connessi al computer eseguire il seguente comando:
La sintassi precedente eseguir il comando who e ne filtrer loutput, eliminando il primo campo (-f1) utilizzando come separatore lo spazio vuoto (-d ), eseguir lordinamento (sort), eliminer le righe duplicate (uniq), eseguir il conteggio delle righe (wc -l) e scriver il tutto nel file risultati (>> risultati) . Quello analizzato sopra un classico esempio di concatenazione di comandi eseguiti grazie al carattere di pipe |.
Processi Un processo un programma in esecuzione. Un sistema multitasking 20 esegue contemporaneamente pi processi. Ad ogni processo assegnato un quantitativo di tempo di esecuzione, la slice 21 tipica pari a 10ms. Nei sistemi operativi Unix e Unix-like PID l'acronimo di process identifier (identificativo di processo) ed un numero intero non negativo assegnato automaticamente che identifica in maniera univoca un processo all'interno del sistema e rimane costante per tutta la durata di generazione ed esecuzione del processo cio fino alla sua terminazione. Il PID un attributo del process control block.
17 Il comando env sta per environment - http://man.cx/env 18 Le variabili definite nella shell non sono visibili dagli script (Scope delle variabili) 19 Comando scp: secure copy - http://man.cx/scp 20 Multitasking: http://it.wikipedia.org/wiki/Multitasking e Time-Sharing: http://it.wikipedia.org/wiki/Time- sharing 21 Multitasking - http://en.wikipedia.org/wiki/Preemption_(computing)
10 Dal terminale possibile avviare un task manager, che fornisce una vista interattiva dei processi, aggiornata ogni secondo, utlizzando il seguente comando:
top
Ulteriori comandi consentono la gestione dei processi e la visualizzazione di numerose informazioni sui processi in esecuzione.
Comando Descrizione top Vista processi, aggiornata ogni secondo q Uscita dal comando top ps Process Show, visualizzazione statica dei processi 22
tty Visualizza il terminale attualmente utilizzato 23
ps -ef Visualizza i processi applicando una specifica formattazione Colonne UID (User ID) e PID (Process ID) ps -ef | wc -l Conta le righe stampate dal comando precedente ps -ef | less Applica la paginazione per loutput del comando precedente: b per pagina precedente, n per successiva, / per cercare. ps -p $$ Visualizza il PID del bash id Visualizza lID dellutente corrente sulla macchina id root Visualizza lID utente della root less /etc/passwd Visualizza le informazioni sugli account utente 24 applicando la paginazione grep nome /etc/passwd Cerca informazioni sullaccount nome nel file degli account utente ls -la $(which ps) Stampa i dettagli relativi al file del comando ps ls -la $(which ssh) Stampa i dettagli relativi al file del comando ssh uname Visualizza il nome del sistema su cui stiamo lavorando 25
uname -a Ulteriori dettagli sul sistema in uso 26
Comandi condizionali
Comando Descrizione echo $? Restituisce 0 se il comando ha funzionato, 1 se ha fallito. Si basa sugli Exit Status dei vari comandi date ; who Lista di comandi, pu essere composta anche da un solo comando if date; echo ciao; fi Lista di comandi separati dal simbolo di semicolonna ; test -f nomefile Verifica lesistenza del file nomefile 27
test 11 -gt 9 echo $? Valuta lespressione, verificando se il primo numero algebricamente maggiore del secondo numero. La seconda riga, restituisce 0 se lespressione vera, 1 se lespressione falsa. In questo caso 0 test 11 \> 9 echo $? Valuta lespressione, verificando se il primo numero maggiore del secondo numero. La seconda riga, restituisce 0 se lespressione vera, 1 se lespressione falsa. In questo caso 1. which [ Vedi il percorso del comando [ . Il comando [ sostituisce test [ 11 \> 9 ] equivalente allutilizzo del comando test
22 Process Show mostra esclusivamente i processi dellutente che sono legati ad un terminale - http://man.cx/ps 23 Nei sistemi Unix-like, anche i terminali sono visti come se fossero file 24 File contenente informazioni sugli account utente - http://en.wikipedia.org/wiki/Passwd_(file) 25 Su MacOS X restituir Darwin, il nome del kernel - http://en.wikipedia.org/wiki/Darwin_(operating_system) 26 Comando uname: http://man.cx/uname 27 Il comando test valuta unespressione - http://man.cx/test
11 possibile costruire delle liste di comande anche utilizzando il comando [: if [ 11 \> 9 ]; then date; fi
Nel comando precedente, cos come nella tabella precedente, il simbolo di maggiore (>) stato preceduto dal simbolo di backslash (\); ci per impedire alla shell di considerare il simbolo > come carattere di redirect delloutput.
Alcuni script e la portabilit MacOS X / Linux Il comando stat 28 visualizza lo stato del file system oppure di un singolo file. Il seguente script, chiamato bistat, consentir lesecuzione del comando stat sia su macchine equipaggiate con MacOS X sia su sistemi GNU/Linux.
#!/bin/bash # bistat if[ $(uname) == Darwin ]; then stat -x $1; else stat $1; fi
Quando si utilizzano le variabili, necessario far precedere il nome dal simbolo $. Una versione alternativa dello script bistat potrebbe essere la seguente:
#!/bin/bash # bistat stringa=$(uname) if[ stringa == Linux ] then stat $1 else -x $1 fi
O ancora:
#!/bin/bash # bistat stringa=$(uname) comando1="stat $1" comando2="stat -x $1" if[ stringa == Linux } then $comando1 else $comando2
Tipi di parentesi: ( ) Brackets (Round Brackets) [ ] Square Brackets { } Brace Brackets
28 Comando stat - http://man.cx/stat
12 Quoting Esistono due tipi di quoting 29 e tre simboli che consentono di attivarne le funzionalit:
STRONG QUOTING WEAK QUOTING Annulla il metavalore di qualsiasi carattere Salva il metavalore di alcuni caratteri rispetto allo strong quoting.
Simboli di quoting Strong Quoting Weak Quoting \ Backslash
Wildcards Esistono alcuni caratteri Jolly che la shell interpreta in modo particolare.
Wildcard Descrizione * Sostituisce uno o pi caratteri (compreso il carattere nullo) allinterno del nome di un file o della sua estensione. ? Sostituisce un solo carattere allinterno del nome di un file o della sua estensione. [ ] Le parentesi quadre racchiudono un elenco di caratteri, ognuno dei quali pu sostituire un singolo carattere in una posizione. - Un trattino (hyphen) usato allinterno delle [ ] denota un range di caratteri da sostituire, es. [a-z] oppure [0-9] ~ Il simbolo di tilde, ad inizio parola, espande il nome della home directory dellutente attuale. Se il simbolo tilde seguito dal nome di un altro utente, far riferimento alla home directory dellutente indicato.
Espansioni della shell La shell espande in un particolare ordine dopo la divisione in parole (token separati da spazi o tabulatori). Tipi di espansione 30 : Brace Expansion Tilde Expansion Parameter Expansion Command Substitution Arithmetic Expansion Process Substitution Word Splitting Pathname Expansion ( *, ? ) Brace Expansion
echo a{b,c,d}e
29 http://wiki.bash-hackers.org/syntax/quoting#weak_quoting 30 Shell Command Language - http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
13 Il comando restituir le seguenti combinazioni: abe, ace, ade. Allo stesso modo, grazie alla brace expansion della shell si possono ottenere tutte le combinazioni tra queste due coppie di opzioni, eseguendo il comando:
echo {1,X,2},{1,X,2}
E ancora, possibile cancellare tutti i file dal nome composto dalla parola file seguita da una combinazione di 0, 1 e 2. (es. file001, file000, file002, file012, ecc.)
rm file[0-2][0-2][02]
File e directory In Unix, a dierenza di quanto avviene in altri sistemi operativi, tutti i le vengono tenuti allinterno di un unico albero la cui radice (quella che viene chiamata root directory) viene montata allavvio. Un le viene identicato dallutente usando quello che viene chiamato pathname, cio il percorso che si deve fare per accedere al le a partire dalla root directory, che composto da una serie di nomi separati da una /. Una directory anchessa un file, solo che un file particolare che il kernel riconosce come tale. Il suo scopo quello di contenere una lista di nomi di file e le informazioni che associano ciascun nome al contenuto. Dato che questi nomi possono corrispondere ad un qualunque oggetto del filesystem, compresa unaltra directory, si ottiene naturalmente unorganizzazione ad albero inserendo nomi di directory in altre directory. Il nome completo di un file viene chiamato pathname ed il procedimento con cui si individua il file a cui esso fa riferimento chiamato risoluzione del nome (filename resolution o pathname resolution). Una delle differenze principali con altri sistemi operativi che per unix tutti i file di dati sono identici e contengono un flusso continuo di byte. Unaltra differenza nel formato dei file di testo: in Unix la fine riga codificata in modo diverso da Windows, in particolare il fine riga il carattere LF (o \n) al posto del CR (\r) del vecchio MacOS e del CR LF di Windows. Il filesystem Unix Lo spazio fisico di un disco viene usualmente diviso in partizioni; ogni partizione pu contenere un filesystem. La strutturazione tipica dellinformazione su un disco che utilizza il filesystem ext2 prevede una separazione dei dati in block group che replicano il superblock 31 . comunque caratteristica comune di tutti i filesystem per Unix, prevedere una divisione fra la lista degli inode e lo spazio a disposizione per i dati e le directory. 32
importante tenere presente che: 1. Linode contiene tutte le informazioni (metadati) riguardanti il file: tipo di file, permessi di accesso, dimensioni, puntatori ai blocchi fisici che contengono i dati. Il comando stat fornisce informazioni che provengono dallinode. Dentro una directory si trover esclusivamente il nome del file ed il numero dellinode ad esso associato. 2. Si possono avere pi voci che puntano allo stesso inode. Ogni inode ha un contatore che contiene il numero di riferimenti che sono stati fatti ad esso (link count); solo quando questo contatore si annulla i dati del file vengono rimossi dal disco. Tale funzione detta unlink e in realt non cancella i dati del file, ma si limita ad eliminare la relativa voce da una directory e decrementare il numero di riferimenti nellinode.
31 Ogni filesystem contiene un superblock che contiene informazioni sul filesystem: tipo di filesystem, dimensione, stato, informazioni sulle altre strutture di metadati. 32 GaPiL - pg. 103-105 - http://gapil.gnulinux.it/files/2011/12/gapil.pdf
14 3. Il numero di inode si riferisce sempre ad un inode nello stesso filesystem, non possibile che una directory contenga riferimenti ad inode relativi ad altri filesystem. 4. Quando si cambia nome ad un file senza cambiare filesystem, il contenuto del file non viene spostato fisicamente, ma viene semplicemente creata una nuova voce per linode in questione e rimossa la vecchia. 5. Gli inode dei file, che contengono i metadati ed i blocchi di spazio disco, che contengono i dati, sono risorse indipendenti ed in genere vengono gestite come tali anche dai diversi filesystem; pertanto possibile sia esaurire lo spazio disco che lo spazio per gli inode, nel primo caso non sar possibile allocare ulteriore spazio, ma si potranno creare file vuoti, nel secondo non si potranno creare nuovi file, ma si potranno estendere quelli che ci sono.
I file non hanno nome negli inode. La numerazioni degli inode unica in ogni filesystem.
Data Descrizione ACCESS Ultima data di accesso al file MODIFY Data in cui vi stata una modifica al contenuto del file CHANGE Data in cui vi stata una modifica ai metadati del file
Comando Descrizione ls -li Mostra il numero di inode di ogni file stat -x nomefile Mostra informazioni sul file contenuti nellinode. 33
apropos contents Esegui una ricerca nel manuale di sistema per la parola contents 34
Iterazioni e cicli Ciclo infinito Se eseguiamo il comando seguente, provocheremo un ciclo infinito, poich il comando true 35 non sar mai falso. Il comando che usa listruzione di iterazione while, dopo aver verificato la condizione diterazione, eseguir il comando date che mander in output la data corrente, attender per una pausa di un secondo e ripeter il ciclo, valutando nuovamente la condizione diterazione.
while true; do date; sleep 1; done
Per interrompere il comando, premere la combinazione di tasti CTRL+D dalla tastiera. Altri cicli for aaa in 1 3 67 890 > do > echo $(($aaa * 2) > done
for ((a=1;a<15:a++)); do echo $a; done
33 Il nome del file non contenuto nellinode 34 Comando apropos - http://man.cx/apropos 35 Comando true - http://man.cx/true
15 Calcolatore Comando Descrizione bc Calcolatore 36
scale=4 Restituir il risultato approssimato a 4 cifre decimali scale=40 Restituir il risultato approssimato a 40 cifre decimali 7/3 Restituir 2,3333 37
Stdin, Stdout, Stderr Lo standard error (stderr) e lo standard output (stdout) per default sono inviati al terminale. Ad ognuno di questi stream 38 standard corrisponde un numero, grazie al quale possibile reindirizzarne il canale predefinito, ad esempio per scrivere allinterno di un file.
Codice Stream 0 Stdin - Standard Input (default: Tastiera) 1 Stdout - Standard Output (default: Terminale) 2 Stderr - Standard Error (default: Terminale)
Ad esempio:
ls * 1> nomefile
Ridirige loutput del comando ls * in un file denominato nomefile.
ls nome_file_non_esistente 2> errore
Eseguendo il comando ls su un file che non esiste e reindirizzando lo standard error in un file denominato errore, troveremo un messaggio di errore simile al seguente:
Such file does not exist
Altri comandi Comando Descrizione tty Vedi il terminale utilizzato al momento cat > /dev/ttys000 Ridirige linput su un altro terminale /dev/null File speciale che elimina tutto ci che riceve 39
cat /dev/random 40 > nomefile Scrive bit a caso in un file (per bloccare CTRL+D) head nomefile Vedi le prime 10 righe del file nomefile 41
head -30 nomefile Vedi le prime 30 righe del file nomefile head -3 nomefile Vedi le prime 3 righe del file nomefile tail nomefile Vedi le ultime 10 righe del file nomefile 42
36 Utilit calcolatore - http://man.cx/bc 37 Se prima si applicher il comando scale=4 38 Panoramica sugli Standard stream - http://en.wikipedia.org/wiki/Standard_streams 39 The Null Device - http://en.wikipedia.org/wiki//dev/null 40 Random Number Generator - http://en.wikipedia.org/wiki//dev/random 41 Comando Head - http://man.cx/head
16 Il comando mostra la riga 25 del file indicato:
head -25 nomefile.txt | tail -1
Il seguente comando mostra la riga 25 del file indicato e visualizza anche il numero di riga:
cat -n nomefile.txt | head -25 | tail -1
Il seguente file contiene tutte le parole della lingua inglese, per aprirlo con TextWrangler scrivere:
edit usr/share/dict/words
Comando Descrizione system_profiler Visualizza le informazioni di sistema (MacOS X) 43
basename nomedirectory Restituisce il nome della directory 44
basename $(pwd) Restituisce il nome della directory attuale stat -f%i nomedirectory Restituisce linode della directory nomedirectory (MacOS X) stat -c%i * Restituisce gli inode di tutti i file di quella directory (GNU/Linux) stat -c%Y * Vedi le date 45 di tutti i file della directory corrente OPTION+F5 ~ (Tilde) Cercare file Il comando find 46 consente di cercare file allinterno di una directory, sulla base di un criterio, segue la sintassi generica del comando.
find directory criterio
Ad esempio il seguente comando cerca allinterno della cartella home dellutente (~), utilizzando la ricerca per nome, il file di nome nomefile.
find ~ -name nomefile
Mentre il seguente comando restituisce tutti i file e le cartelle che si chiamano dir*:
find ~ -name dir\* 47
Il seguente comando stampa a video i risultati della ricerca (anche se find lo fa di default)
find ~ -name dir\* -print
42 Comando Tail - http://en.wikipedia.org/wiki/Tail_(Unix) 43 Comando system_profiler - https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/system_profiler.8.html 44 Comando basename - http://man.cx/basename 45 Le date sono espresse in secondi a partire dal 01/01/1970 (Epoch) 46 Comando find - http://man.cx/find 47 Il carattere * stato preceduto da uno backslash \ per evitare la pathname expansion della shell
17 Il seguente comando filtra i risultati per tipo di file
# cerca solo i file find ~ -name dir\* -type f
# cerca solo le cartelle find ~ -name dir\* -type d
possibile combinare le ricerche, imponendo una condizione OR tra i tipi:
find ~ -name dir\* \(-type f -o -type d\) -print
Nellesempio seguente, il comando cercher i file di 102 byte.
find ~ -size 102c
Altri esempi:
find ~ -name dir\* -type f -exec file {} \;
find ~ -size -100c -exec stat -c%s \; 2> /dev/null
Script Costruire uno script che prenda come argomento il nome di una directory e faccia la somma delle dimensioni in byte dei file in essa contenuti.
#!/bin/bash if[ $(uname) == Darwin ] then find $* -type f -exec stat -f%z {} \; 2>/dev/null | tr \\n + echo 0 elif[ $(uname) == Linux ] find $* -type f -exec stat -c%s {} \; 2>/dev/null | tr \\n + echo 0 then echo Che sistema operativo utilizzi? fi | bc echo '$* = ' $*
Il comando principale del nostro script sar:
find $* -type f -exec stat -f%z {} \;
Che si occuper (in ambiente MacOS X) di trovare tutti i file nella cartella. Il comando tr 48 si occuper della trasformazione gli a capo (newline) in un +. tr \\n +
48 Translate Characters - http://man.cx/tr
18 Oppure nellesempio seguente, trasformiamo tutti i caratteri di : in uno spazio bianco:
echo $PATH | tr :\ ' '
Utilizzo del comando grep Cercare la stringa inu allinterno di un file denominato sommabytes.sh
grep inu sommabytes.sh
Cercare la stringa inu allinterno del file del dizionario:
grep inu /usr/share/dict/words
Cercare la stringa inu in tutti I file della directory corrente:
grep -r inu .
Copiare un file da un computer remoto al pc locale, ad esempio il file del dizionario italiano
Simbolo Descrizione ^ Caret - Inizio riga (Allinterno delle Square Brackets assume un significato diverso) $ A fine stringa, indica la fine della parola
grep '^[abc]...[xyz]' italian
grep '^[abc]...[xyz]$' italian
Cercare nel file indicato le parole che iniziano per r e che terminano per sa e che abbiano 3 caratteri tra inizio e fine parola:
grep '^r...sa$' /Users/Name/Desktop/italian
Cercare nel file indicato tutte le parole che contengono almeno tre vocali di seguito:
grep -E '[^aeiou]{3,}' italian
Cercare le parole che contengono almeno 5 vocali di seguito:
grep -E '[^aeiou]{5,}' italian
Per le parole che contengono solo 5 vocali di seguito:
grep -E '[^aeiou]{5}' italian
19 Parameter Expansion 49
Definire una variabile a e visualizzare il suo valore a terminale:
a=10 echo $a
Concatenare al valore di a un numero: echo ${a}4
Se il parameter non impostato o nullo, lespansione di word sostituita. Altrimenti parameter manterr il suo valore:
${parameter:-word}
Se il parameter non impostato o nullo, assegna a parameter il valore di word:
${parameter:=word}
Se il parameter non impostato o nullo, lespansione di word (oppure un messaggio che informa della non esistenza di word) scritto nello standard error e la shell, se non interattiva, termina. Altrimenti viene mantenuto il valore di parameter:
${parameter:?word}
Se il parameter non impostato o nullo, non verr modificato, altrimenti, sostituir il valore del parametro con lespansione di word:
Il comando seguente restituisce la lunghezza della stringa assegnata ad una variabile:
echo ${#a}
49 Bash Expansions - http://man.cx/bash#heading14
20 Trova la stringa CDE e la sostituisce con 123. Attenzione! Il valore di a non cambia. Sar sostituita solo la prima occorrenza:
echo ${a/CDE/123}
Per effettuare la sostituzione in tutte le occorrenze:
echo ${a//CDE/123}
Per eliminare il match pi corto del pattern:
${parameter#pattern}
Per eliminare il match pi lungo:
${parameter##pattern}
Date ed orari I comandi presentati di seguito mostrano una serie di utilizzi e di formattazione della data.
Comando Descrizione/Risultato date Thu Apr 12 16:10:00 CEST 2012 - Data completa date +%A Mostra il nome completo del giorno della settimana: es. Thursday date +%h Mostra il mese date +%H Mostra lora date +%H%M%S Visualizza ore, minuti e secondi, senza separatori: es. 085012 date +%H:%M:%S Visualizza ore, minuti e secondi con separatori: es. 08:50:12 date "+%H:%M:%S $a" Visualizza lorario completo ed il valore della variabile a date +%Y Visualizza lanno date +%Y%m%d%H%M%S 20120412162016 - visualizza data ed ora complete, senza separatori cal Visualizza il calendario del mese corrente cal anno Visualizza il calendario dellanno indicato cal 2012 Visualizza il calendario dellanno 2012
Per visualizzare la data attuale completa, formattata, eseguire:
date "+%d/%m/%Y %H:%M:%S"
che restituir un output simile al seguente:
12/04/2012 16:21:16
21 Script
Costruire uno script che prenda come argomento una directory e tolga gli spazi dai nomi dei file in essa contenuti.
Innanzitutto creare una cartella e creare al suo interno una serie di file che contengano spazi allinterno del nome:
Il comando che elimina gli spazi pu essere semplificato ad una singola riga:
for i in *; do mv "$i" ${i/Nome con spazio/NomeSenzaSpazio}; done
Tuttavia il comando precedente lavorer esclusivamente con i file che abbiano come nome il pattern indicato nel comando stesso, nellesempio Nome con spazio.
Anche con il comando tr 50 possibile eliminare gli spazi:
22 Array Assegnamento di un valore agli elementi 0, 1 e 2 del vettore a:
a[0]=5 a[1]=5 a[2]=6
Il comando seguente visualizzer il vettore utilizzando un ciclo:
for i in 0 1 2 3 4 5 6; do echo elemento $i = ${a[$i]}; done
Una scrittura alternativa del comando la seguente:
for i in 0 1 2 3 4 5 6; do echo elemento $i = ${a[i]}; done
Per visualizzare la lunghezza dellarray (saranno conteggiati esclusivamente gli elementi non nulli):
echo ${#a[*]}
possibile creare e popolare un array b come di seguito:
b=(1 34 56 78 98 34 56 23 12)
possibile popolare un array con loutput di un comando, ad esempio:
c=($(cat italian)) echo ${#c[*]} Italian il file del dizionario Restituir 116878
Valori casuali Comando Descrizione/Risultato echo $RANDOM Genera un numero casuale echo $((15%4)) Operazione Modulo echo $((RANDOM*RANDOM%116878)) Genera e moltiplica fra loro due numeri casuali, successivamente esegue loperazione modulo del numero ottenuto per 116878.
Costruire uno script che generi parole casuali dal dizionario Italiano: iching.sh #!/bin/bash c=($(cat /path/Documents/italian)) echo ${c[RANDOM]} ${c[RANDOM]} ${c[RANDOM]} ${c[RANDOM]} ${c[RANDOM]} \ ${c[RANDOM]} ${c[RANDOM]}
23 Costruire uno script che estragga casualmente 7 parole dal dizionario inglese, le visualizzi a terminale e le legga. iching2.sh #!/bin/bash c=($(cat /usr/share/dict/words))
Comando Descrizione ps Visualizza i processi che utilizzano terminali tty Visualizza il terminale attualmente utilizzato id Visualizza lID dellutente corrente sulla macchina id root Visualizza lID utente di root ps -e Visualizza tutti i processi (anche senza terminali) anche di altri utenti ps -f Vedi lUser ID (UID) ps -ef Visualizza i processi applicando una specifica formattazione Colonne UID (User ID) e PID (Process ID) pstree (Linux) visualizza lalbero dei processi echo $$ Visualizza il Process ID del bash in esecuzione
Con il comando ps -ef i dati verranno formattati in tre colonne:
UID PID PPID User ID Process ID Parent Process ID
Ad ogni file sono assegnati 12 permessi totali, infatti oltre ai classici 9 bit dei permessi del proprietario, del gruppo e degli altri (U.G.O), esistono 3 bit precedenti che consentono di eseguire il processo come se si stesse utilizzando un altro account. I 3 bit in questione sono i seguenti:
Bit Descrizione 4 Set User ID bit 2 Set Group ID bit 1 Sticky bit
Se il bit Set User ID impostato, quando esegue un file/processo, esso viene eseguito con lidentit del proprietario del file. Esiste infatti una differenza tra:
Real User ID Effective User ID ID dellutente che ha avviato il file eseguibile del processo ID del proprietario del file che viene eseguito.
24 Se ad esempio si avvia il comando di cambio password, il file associato al processo di propriet della root, pertanto lEffective User ID sar quindi root.
/usr/bin/passwd
possibile personalizzare loutput del comando Process Show ps 51 specificando i campi desiderati, come negli esempi seguenti:
Comando Descrizione ps -e -opid,comm Visualizza le colonne Process ID (PID) e il comando lanciato ps -e -opid=XYZ,comm=KLM Visualizza le colonne PID e CMD personalizzandone le intestazioni ps -e -opid=,comm= Visualizza le colonne PID e CMD con le intestazioni vuote ps -e -opid,ruid,uid,comm Visualizza le colonne PID, Real User ID, Effective User ID e CMD -time Visualizza la colonna relativa al tempo cumulativo di esecuzione del processo ps -p XXXXX -ouid Visualizza lUID del processo numero XXXXX
Lopzione -o del comando ps consente di specificare il formato di output sotto il controllo dellutente:
Comando Descrizione ps -e -opid,ruid,uid oppure ps -e -opid,ruser,user Visualizza le colonne Process ID (PID), la colonna Real User ID e la colonna Effective User ID (UID) di tutti i processi in esecuzione sulla macchina ps -e -opid=ID,uid=UTENTE Visualizza PID e UID, personalizzando lintestazione
possibile creare un array che contenga tutti i PID dei processi attivi sul sistema:
arraypid=($(ps -e -opid=)) echo ${#arraypid[*]}
Per assegnare ad a il valore dellUser ID che esegue un dato processo:
a=$(ps -p 92174 -ouid=) echo $a
La visualizzazione dei processi pu essere ulteriormente personalizzata come nellesempio seguente:
for i in $(echo ${arraypid[*]}) > do > echo processo $i eseguito da $(ps -p $i -ouid=) > done
51 Process Show - http://man.cx/ps
25 Costruire uno script che inserisca in due array differenti le informazioni relative ai processi attivi nel sistema, in particolare, nel primo array inserisca il PID e nel secondo inserisca lUID e si crei una visualizzazione a terminale che faccia corrispondere gli elementi del primo array con quelli del secondo.
#!/bin/bash # ****************************** # File: psindoublearray.sh # Function: Puts in two arrays data for all the processes in the system #
primoarray=($(ps -e -opid=)) for ((i=0; i < ${#primoarray[*]}; i++)) do secondoarray[i]=$(ps -p ${primoarray[i]} -ouid=) done for ((i=0; i < ${#primoarray[*]}; i++)) do echo ${primoarray[i]}-----${secondoarray[i]} done
Sostituendo nel secondo array lUID con il Comando eseguito dal processo, si avrebbe
#!/bin/bash # ****************************** # File: psindoublearray2.sh # Function: Puts in two arrays data for all the processes in the system #
primoarray=($(ps -e -opid=)) for ((i=0; i < ${#primoarray[*]}; i++)) do secondoarray[i]=$(ps -p ${primoarray[i]} -comm=) done for ((i=0; i < ${#primoarray[*]}; i++)) do echo ${primoarray[i]}' <---> '${secondoarray[i]} done
26 Codifica Su un computer i caratteri dellalfabeto sono codificati come numeri al fine di facilitare la memorizzazione di un testo o la sua trasmissione attraverso le reti. Esistono una lunga serie di codifiche disponibili, le pi diffuse sono: ASCII 52 e Unicode 53 . ASCII un sistema di codifica dei caratteri a 7 bit, comunemente utilizzato nei calcolatori, ideato nel 1961 e divenuto standard ISO 646. Alla specifica iniziale basata su codici 7 bit, negli anni successivi, fecero seguito una serie di estensioni ad 8 bit con lo scopo di aumentare il numero di caratteri rappresentabili, includendo le vocali accentate e altri simboli (Extended ASCII 54 ). Unicode un sistema di codifica che assegna un numero univoco ad ogni carattere usato per la scrittura dei testi, in modo indipendente dalla lingua, dalla piattaforma e dal programma utilizzati. Il codice assegnato al carattere viene rappresentato con U+, seguito dalle 4 (o 6) cifre esadecimale del numero che lo individua. Unicode incorpora lo standard ISO/IEC 8859-1 e codifica i caratteri utilizzati in quasi tutte le lingue, nonch simboli matematici, chimici, cartografici, lalfabeto Braille, ideogrammi e altri simboli. UTF-8 55 una codifica di caratteri Unicode in sequenze di lunghezza variabile di byte, creata da Rob Pike e Ken Thompson. UTF-8 utilizza da 1 a 4 byte rappresentare un carattere Unicode. Un solo byte necessario per rappresentare i 128 caratteri dellalfabeto ASCII (posizioni Unicode da U+0000 a U+007F).
Comando Descrizione hexdump file Visualizza il file indicato nel formato specificato dallutente 56
hexdump -c file Visualizza il file specificato in esadecimale, 16 caratteri per riga, in 3 colonne separate da spazi.
Una tabella dei caratteri UTF-8 pu essere trovata alla pagina web: http://www.utf8-chartable.de/
I diversi sistemi operativi rappresentano in modo differente la fine di una riga di testo (newline). Il simbolo di newline 57 non un carattere visibile sullo schermo .
Rappresentazione Sistema Operativo LF Unix / Unix-like, GNU/Linux, MacOS X, FreeBSD CR MacOS (fino alla versione 9) CR+LF Microsoft Windows, DOS, Symbian OS, Palm
In Unicode tali simboli sono rappresentabili:
Simbolo Descrizione Unicode LF Line Feed U+000A CR Carriage Return U+000D CR+LF Carriage Return + Line Feed U+000D U+000A
52 American Standard Code for Information Interchange - http://it.wikipedia.org/wiki/ASCII 53 Unicode - http://it.wikipedia.org/wiki/Unicode - http://www.unicode.org/ 54 Extended ASCII (ISO 8859) - http://it.wikipedia.org/wiki/ISO_8859 55 UTF-8 (Unicode Transformation Format - 8 bit) - http://it.wikipedia.org/wiki/UTF-8 56 Comando hexdump - http://man.cx/hexdump 57 Newline - http://en.wikipedia.org/wiki/Newline
27 Conversioni tra codifiche possibile modificare la codifica di un file utilizzando il comando iconv 58
iconv [-f encoding] [-t encoding] [file]
Per visualizzare tutti i formati disponibili:
iconv -l
Oppure per convertire il file dalla codifica ISO Latin1 alla codifica UTF-8:
iconv -f L1 -t UTF-8 testo-ISOLatin1.txt
Dove L1 identifica la codifica ISO Latin1.
possibile convertire la codifica di un file e salvarne il contenuto in un nuovo file:
disponibile online un file di testo in formato UTF-8 che dimostra le potenzialit di questa codifica: http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt
Job Control 59 di Bash Bash consente di lanciare un job e di metterlo in background in modo tale da poter continuare ad utilizzare il terminale per eseguire altri jobs, che quindi sono eseguiti in foreground.
Per lanciare un job e porlo in background:
find / -name asdsa 2>/dev/null &
Il simbolo & al termine del comando, pone il job lanciato, nellesempio find in background.
Comando Descrizione jobs Vedi tutti i jobs attivi CTRL+Z (^Z) Interrompe il comando fg %1 Poni in foreground il processo 1 bg Continua il job in background fg Continua il job in foreground
Lo standard input di solito indirizzato al job in foreground.
28 Personalizzazione della shell, gli alias e le funzioni Il file .bash_profile uno startup-file di bash, esso contiene delle informazioni e delle configurazioni personalizzabili di bash. Per visualizzarne il contenuto:
cat .bash_profile
Una shell di login 60 (cio associata alla finestra) rappresentata in ps (Process Show) con un trattino (hyphen) davanti al nome. Ad esempio: -bash
possibile modificare alcune opzioni della shell, modificando il file .bash_profile Ad esempio, per personalizzare linizio di ogni riga del prompt 61 :
PS1="\t -> "
inoltre possibile definire degli alias per alcuni comandi, sempre nel file .bash_profile
alias ll='ls-la'
Nellesempio sopra, stato creato un alias per il comando ls-la che potr essere lanciato scrivendo ll. Gli alias possono essere definiti anche utilizzando le funzioni.
La funzione seguente definisce il comando pman che consente di ottenere una versione stampabile in formato PostScript/PDF della pagina di manuale relativa al comando fornito come argomento, inoltre apre nellapplicazione Anteprima di MacOS X, il file creato.
pman() { man -t "${1}" | open -f -a /Applications/Preview.app }
Comando Descrizione pman bash Apre in formato PostScript il manuale di bash pman open Apre in formato PostScript il manuale di open
La funzione seguente definisce un alias per il comando ls applicato sulla home directory dellutente.
casa() { ls ~ }
In .bash_profile possibile includere un altro file scrivendo:
29 Il comando seguente funziona esclusivamente per il primo file:
find . -type f -name asy\* | stat -x
Mentre utilizzando xargs 62 passa come argomenti tutti i file restituiti dal primo comando:
find . -type f -name asy\* | xargs stat -x
Eventuali spazi nei nomi dei file possono creare problemi. Per evitare tali problemi, possibile separare mediante un carattere NULL i risultati del comando find.
Crittografia possibile crittografare del testo, oppure il contenuto dei file utilizzando differenti algoritmi.
Comando Descrizione md5 Codifica restituendo un digest composto da 32 caratteri alfanumerici (solo lettere e numeri) md5 * Restituisce il digest dei file contenuti nella directory corrente md5 -q * Mostra solo gli md5 md5 nomefile Restituisce lhash md5 relativo al file
Su Linux il comando analogo md5sum:
Comando Descrizione md5sum * Restituisce il digest dei file contenuti nella directory corrente md5 * 2>/dev/null Restituisce il digest dei file contenuti nella directory corrente e ridireziona loutput.
Il comando:
echo andiamo a mangiare un gelato | md5
Restituir lhash md5 del contenuto del comando echo.
Il comando seguente verificher le differenze tra i file forniti come argomento:
diff nomefile1 nomefile2
Esiste un ulteriore comando per la crittografia in diversi formati:
openssl dgst -md5 nomefile.txt Restituisce lhash md5 del file openssl dgst -sha1 italian_linux.txt Restituisce lhash sha1 del file
62 http://man.cx/xargs
30 possibile crittografare/decrittare il contenuto di un file e salvarlo in un file:
Lattributo -d nellultimo comando indica che si tratta di una decodifica.
Scope delle variabili Una variabile definita in bash non sar conosciuta da un bash interno ad esso.
a=5 echo $a bash echo $a
La variabile a vale 5 Aprendo un bash interno al bash principale La variabile a non sar conosciuta
Per esportare una variabile in shell interne necessario utilizzare il comando export
a=5 echo $a export a bash echo $a
La variabile a vale 5 Esporta il valore della variabile alle altre shell Aprendo un bash interno al bash principale La variabile a vale 5
Il comando export funziona con i livelli inferiori, cio se uso il comando export su una variabile definita in un bash di secondo livello, tale variabile sar conosciuta dai livelli inferiori (3, 4, 5, ecc.), ma non sar conosciuta dal bash di 1 livello. Le modifiche apportare alle variabili nei livelli inferiori, non saranno applicate ai livelli superiori.
echo $SHLVL Restituisce il livello di shell su cui si sta operando
Hard Link & Soft Link Soft Link 63
Si dice collegamento simbolico (o Link Simbolico / Symlink / Soft link) un particolare tipo di file che un rimando ad un altro file o directory. Un link simbolico un file contenente un percorso relativo o assoluto al file o directory a cui fa riferimento; questo permette di creare collegamenti non solo allinterno della stessa partizione, ma anche da un file system ad un altro, offrendo pi flessibilit rispetto ad un collegamento fisico. La flessibilit si trasforma in minore affidabilit in quanto, se il file a cui punta viene rimosso o cambiato di nome, il collegamento rimane orfano.
Per creare un link simbolico si usa il comando ln
ln -s nomefile nomelink
Il soft link sar rappresentato dal comando ls:
ls -la nom* nomelink -> nomefile
63 Soft link - http://it.wikipedia.org/wiki/Collegamento_simbolico
31 Hard Link 64
Si dice collegamento fisico (hard link) lassociazione del nome di un file al suo contenuto. Un collegamento fisico fa riferimento ai dati (il contenuto) di un file, e in ci si differenzia dai collegamenti simbolici che fanno riferimento a nomi di file. Unaltra differenza che il collegamento fisico deve trovarsi sullo stesso file system che contiene i dati a cui fa riferimento, e che un collegamento fisico non pu restare orfano. Per ogni file o directory nei sistemi Unix il file system mantiene un identificativo univoco (inode) ed un conteggio degli hard link che vi fanno riferimento. Un hard link contiene semplicemente il nome ed il riferimento allinode del file, senza altre informazioni. Leliminazione di un file (cio di un suo collegamento fisico) non implica lannullamento di tutti i collegamenti fisici ad esso, perch ogni hard link indipendente. Lo spazio occupato dai dati pu essere liberato solo quando il conteggio degli hard link di un file diventa zero.
Per creare un link simbolico si usa il comando ln
ln nomefile nomelink
Le directory hanno sempre gemelli (cio hard link che le puntano) poich sono referenziate dalle directory figlie e dalla directory parent.
Comando Descrizione echo $SECONDS Tempo, in secondi, dallavvio della shell echo $COLUMNS Visualizza il numero delle colonne della shell attiva COLUMNS=70 ./nomescript Imposta il numero delle colonne a 70 per eseguire lo script indicato
Operazioni matematiche
bc 4/3 scale=10 4/3 scale=4 4/3 bc -l s(5) s(x) c(x) a(x) l(x) e(x) echo 4/3 | bc echo 4/3 | bc -l echo 'scale=5;4/3' | bc Apre un ambiente matematico Restituir 1 Utilizza unapprossimazione a 10 cifre decimali Restituir 1,3333333333 Utilizza unapprossimazione a 4 cifre decimali Restituir 1,3333 Carica la libreria standard delle funzioni matematiche sin(5) = -.958 rad sin(x) cos(x) arctan(x) logaritmo(x) esponenziale(x) Restituir 1 Restituir 1,333 approssimato a 20 cifre decimali Restituir 1,33333
64 Hard Link - http://it.wikipedia.org/wiki/Collegamento_fisico
32 Browser da riga di comando possibile visualizzare in versione testuale siti internet e pagine web utilizzando il browser da riga di comando Lynx 65 . possibile scaricare lultima versione di Lynx dal sito ufficiale del progetto 66 .
Per visitare ad esempio, il sito www.repubblica.it, si scriver il seguente comando nel terminale:
lynx http://www.repubblica.it
Per scaricare la pagina web contenente il testo completo della Divina Commedia:
Si procede con leventuale modifica della codifica del documento, per evitare problemi di interpretazione delle lettere accentate e di altri simboli, conviene convertire il documento nel formato UTF-8. Successivamente necessario sostituire gli spazi tra le parole con un newline (a capo).
cat divina_utf8.txt | tr ' ' '\n'
Tuttavia sarebbe opportune eliminare dal testo anche i simboli di interpunzione:
cat divina_utf8.txt | tr ' ,.;?-:()' '\n'
possibile eliminare tutti i segni di interpunzione direttamente tramite uno specifico argomento del comando tr. Lesercizio chiede di trovare la parola pi utilizzata nel testo, pertanto dopo la pulitura del testo, si proceder ad un primo ordinamento alfabetico ed alleliminazione dei doppioni (unopzione del comando uniq conter le occorrenze di ogni parola), in seguito si applicher un ordinamento numerico (lopzione nr del comando sort) e si applicher la paginazione al risultato. Il comando completo sar analogo al seguente:
33 Esercizi Costruire uno script che disegni verticalmente una sinusoide continua la cui frequenza viene fornita come parametro.
#!/bin/bash if [ $# -ne 1 ]; then echo 'Usage export COLUMNS; ./sinusoide.sh frequenza'; exit; fi if [ -z $COLUMNS ]; then echo 'Usage: export COLUMNS; ./sinusoide.sh frequenza'; exit; fi ampiezza=$(( COLUMNS/2 )) frequenza=$1 t=0; while true; do b=$(echo "c=$ampiezza*s($frequenza*$t*3.14/180);scale=0; $ampiezza + c/1" | bc -l); for (( a = 1; a < b; a++ )); do echo -n " "; done; echo '*'; ((t++)) done
Costruire uno script che stampi la percentuale della CPU utilizzata dal comando del quale viene fornito il PID.
#!/bin/bash
pid=$1
#scale=${2:-2} # this line is an alternative to the following
echo ${scale:=2} > /dev/null
while true; do cpu=$(ps -p $pid -o%cpu= | tr , .) sleep 0.05 b=$(echo "c=$scale*$cpu;scale=0; c/1" | bc -l); for (( a = 1; a < b; a++ )); do echo -n "-"; done; echo '*'; done
34 Ulteriori informazioni sui processi Quando si lancia un comando, avvengono due fasi: 1. FORK 67 : bash si duplica, copia variabili, stato della memoria 2. EXEC 68 : prende come argomento il file eseguibile sul disco, lo esegue, prende i dati (variabili, ecc) del file eseguibile. possibile trasformare il bash corrente nel comando indicato, inserendo un comando analogo al seguente:
exec nomecomando
Ad esempio ls:
exec ls
Esistono due tipi di comandi: COMANDI SU DISCO SHELL BUILTIN I comandi su disco prevedono la creazione di un processo mediante fork ed exec. Un comando builtin viene eseguito direttamente da bash. possibile verificare se un comando delluno o dellaltro tipo, utilizzando il comando type:
which echo type echo type cp type sleep /bin/echo echo is a shell builtin cp is /bin/cp sleep is /bin/sleep
Il comando type restituir il percorso del file eseguibile, qualora si tratti di un comando su disco. Quando un processo parte ha una sua memoria (virtuale), ogni processo convinto di avere a disposizione il massimo della memoria indirizzabile. In un sistema a 32 bit, la memoria totale indirizzabile 2 32 , cio 4 GB.
Lo swapping 69 consiste nellutilizzo di spazio su disco come spazio temporaneo per la memoria dei processi non attivi.
cd /proc cat cpuinfo ls cd $$ ls -lad cwd cat environ cat maps Process information pseudo-filesystem 71
Visualizza informazioni sulla CPU Visualizza i file presenti nella cartella /proc Vai alla directory corrispondente al bash Informazioni sulla Current Working Directory Variabili dambiente associate al processo corrente Visualizza una mappa della memoria
Comando Descrizione free Visualizza lo stato della memoria (Totale/Utilizzata/Libera) pmap PID Librerie utilizzate da un processo (funziona solo a runtime) pmap $$ Librerie utilizzate dal processo Bash ldd /bin/bash Visualizza le dipendenze di un processo 72 (anche a processo non avviato) size /bin/bash Visualizza le dimensioni vmstat Visualizza lo stato della memoria virtuale printf Funzione simile alla printf del linguaggio C 73
Esistono directory che hanno lo sticky bit, esso necessario in cartelle utilizzate da molti utenti affinch ogni utente possa cancellare i propri file e non quelli degli altri. Per trovare le cartelle che hanno impostato lo sticky bit, eseguiamo il comando:
find / -type d -perm +1000 2>/dev/null
Le directory hanno inoltre il privilegio di esecuzione: tale permesso denominato search bit, in quanto consente di accedervi per ricercare file. Per verificare, eseguire il comando:
ls -lad nomecartella
Comando Descrizione du . Disk Usage - Cartella corrente du nomefile Disk usage - File indicato, se il file vuoto occupa 0 blocchi su disco gzip -r nomecartella Comprimi la cartella indicata 74
Comando Descrizione nice nomeprogramma Il comando abbassa la priorit del processo exec nomeprogramma Sostituisce allo shell in uso lo script lanciato con il comando exec ls 1>filetemp.txt Sostituisce allo shell il comando ls il cui output viene salvato in filetemp.txt
Per trovare tutti i softlink presenti in home si esegue:
find ~ -type l | less
Il comando seguente restituisce il percorso del file a cui punta il softlink:
readlink "/percorso/cartella/nomelink"
Segnali I segnali sono Software Interrupt, cio un segnale appunto o un messaggio che avvisa circa il verificarsi di un certo evento. Esistono due tipi di segnali 75 : sincroni e asincroni. Quando ad esempio un utente preme la combinazione di tasti CTRL-C viene generato un segnale che forza linterruzione di un processo.
Il kernel invia al processo un segnale, il processo, una volta ricevuto il segnale pu scegliere uno dei tre comportamenti disponibili: DEFAULT: generalmente terminate process IGNORARE IL SEGNALE: il segnale viene quindi ignorato ed il processo continua lesecuzione GESTIRE IL SEGNALE: il processo gestisce il segnale mediante un Signal Handler
Il segnale 17 non pu essere gestito [SIGSTOP]. Gestire i segnali possibile gestire i segnali mediante il comando trap del quale segue la formattazione:
trap [-lp] [arg] [sispec ...]
Il comando arg da leggere e da eseguire quando la shell riceve il segnale sigspec. Se arg assente oppure -, tutti gli specifici segnali sono reimpostati ai loro valori originali (i valori che avevano precedentemente allingresso nella shell). Se arg la stringa nulla il segnale specificato da ogni sigspec ignorato dalla shell e dal comando che invoca. Se arg non presente ed fornito -p, i comandi trap associati con ogni sigspec sono visualizzati. Se non vengono forniti argomenti o se dato solo -p, trap stampa la lista dei comandi associati con ogni numero di segnale. 76
Comando Descrizione trap ls SIGINT Ad ogni segnale SIGINT (che si genera premendo CTRL-C) esegue il comando ls trap -p Visualizza tutti i segnali gestiti trap - SIGINT Annulla le impostazioni definite per il segnale SIGINT ulimit -a Visualizza i limiti della macchina in uso
kill -SIGINT PID kill -SIGINT 2264 kill -SIGKILL $$ kill -SIGSTOP 57348 kill -SIGCONT 57348 Invia il segnale SIGINT al processo indicato Invia il segnale SIGINT al processo 2264 Invia il segnale SIGKILL (Termina) al bash corrente Invia il segnale SIGSTOP (Stoppa) al processo 57348 Invia il segnale SIGCONT (Riprendi) al processo 57348
Ricerca nel computer In MacOS X esiste un motore di ricerca integrato, denominato Spotlight 78 che consente di effettuare ricerche approfondite tra i file presenti sul computer ed allinterno del contenuto dei file stessi. Spotlight dispone di un indicizzatore istantaneo.
Esiste una versione del motore di ricerca, disponibile dalla riga di comando, il comando mdfind 79
Comando Descrizione mdfind -0 Separa i risultati mediante NULL (per manipolarli con xargs) mdfind -onlyin cartella Restringe la ricerca ad una specifica cartella mdfind -live Il comando continua a girare, aggiorna i risultati in tempo reale mdls nomefile Restituisce i metadati del file strings nomefile Visualizza le stringhe di un file binario
mdfind consente anche di eseguire ricerche in base ai metadati di un file. Il comando seguente cercher tutti i file di immagine la cui altezza in pixel sar inferiore a 500 pixel.
mdfind 'KMDItemPixelHeight<500'
Il comando seguente cercher tutti I file di imagine la cui altezza in pixel compresa tra 440 e 500 pixel:
Il comando seguente, uguale al precedente, manipoler loutput restituendo laltezza in pixel di ogni immagine trovata ed eseguir un ordinamento delloutput.
77 Kill - Terminate or signal processes - http://man.cx/kill 78 Apple Spotlight - http://en.wikipedia.org/wiki/Spotlight_(software) 79 Ulteriori informazioni su mdfind - http://macdevcenter.com/lpt/a/6403
39 Tubi a T possibile costruire dei tubi a T, per estrarre il risultato di un comando, tra due pipe, cos da poter manipolare il risultato intermedio dei comandi. Il comando tee serve per costruire questo tipo di tubi, come nellesempio:
ps -ef | tee uscitatubo.txt | grep bash
Altri comandi
Sed un linguaggio di scripting, un suo utilizzo interessante la sostituzione di caratteri.
echo casa | sed s/sa/ma Restituir cama, sostituir la sillaba sa con ma
Il comando jot genera una serie di dati sequenziali o casuali.
Comando Descrizione jot 25 0 9 25 numeri compresi tra 0 e 9, incremento di default 1 jot 25 0 25 numeri compresi tra 0 e 24 jot -r 25 0 25 numeri casuali, partendo da 0 jot -r 25 0 1000 25 numeri casuali, compresi tra 0 e 1000 jot -r -c 100 a z 100 caratteri casuali (a-z)
Il comando rs serve per dare forma ad un array di dati, combinandolo con jot possibile ottenere dei dati casuali e formattarli in un modo specifico.
Per visualizzare 1000 caratteri casuali, organizzati in una matrice 4x4, il comando sar:
jot -r -c 1000 a z | rs 4 4
Il comando rs seguito dal numero di righe e dal numero di colonne.
Per organizzare i dati in 20 colonne ed eliminare gli spazi di divisione del contenuto:
jot -r -c 1000 a z | rs -g 0 20
Formare parole casuali e verificarne leventuale esistenza nel dizionario:
jot -r -c 10000 a z | rs -g 0 4 | xargs -I % grep ^%$ italian
Il comando dd 80 serve per copiare e convertire un file, nellesempio prendere il fileinput.txt e ne crea una copia, scegliendo le prime 3 lettere dalla prima riga.
Dato che la prima parola di fileinput.txt Achille il file di destinazione fileoutput.txt conterr ill.
80 Convert and Copy a File - http://man.cx/dd
40 Comando Descrizione df Visualizza i filesystem montati echo 4 | tr \\064 d Sostituisce con un range ottale echo 45678 | tr \\064 - \\067 defgh Sostituisce con un range ottale tr -d \\000 - \\037 Elimina tutti i caratteri da 0 a 37 ottale
Comando Descrizione fuser nomefile Lista dei PID che hanno aperto il file nomefile lsof -p PID Quale file ha aperto un processo o una lista di processo lsof Lista i file aperti da tutti i processi
Differenze tra i file Per trovare le differenze tra due file c il comando diff
diff nomefile1 nomefile2 diff nomefile1 nomefile2 > patch Restituisce le differenze (20a21,22) Salva in un file le differenze tra due file
possibile patchare un file utilizzando il comando patch, utile per aggiornare un file allultima versione.
patch nomefile filepatch Applicher filepatch al file nomefile
possibile confrontare due file utilizzando il comando cmp 81 , indicato per il confronto di file binari.
Comando Descrizione killall nomedelprocesso Chiude tutte le istanze del processo killall nano Chiude tutte le istanze delleditor nano killall TextWrangler Chiude tutte le istanze di TextWrangler
Strumenti di rete
Comando Descrizione open http://www.liis.it Apri la pagina www.liis.it curl http://www.liis.it Restituisce il codice HTML della pagina ping 193.204.64.3 Esegui ciclicamente il ping dellIP indicato (CTRL+C per bloccare) ping -q 193.204.64.3 Verifica lesistenza di una macchina ifconfig Visualizza le informazioni sulle interfacce e le connessioni di rete sul PC netstat Statistiche sulle connessioni di rete netstat -f inet Filtra ci che riguarda le connessioni internet netstat -f inet -p tcp Connessioni internet attive netstat -b -I en0 -f inet -p tcp Connessioni aperte dallinterfaccia en0 whois 193.204.64.3 Visualizza informazioni sul proprietario dellindirizzo IP
81 Compare Files - http://man.cx/cmp
41 Per visualizzare tutte le interfacce di rete del PC:
ifconfig -a
Creare uno script che da ifconfig -a tiri fuori tutti gli indirizzi IP utilizzati dalla macchina:
#!/bin/bash
for i in $(ifconfig -a | grep UP | cut -d: -f1); do ifconfig $i | grep '\binet\b' done | cut -d' ' -f2
Shell Builtin di Bash
Comando Descrizione source Equivalente di #include del linguaggio C Include un file allinterno del comando che si sta eseguendo break Serve per uscire dal loop (ad esempio while) set -x Dopo lespansione dei comandi semplici, visualizza lespansione del prompt quaternario PS4, seguito dal comando ed i suoi argomenti espansi. Fa vedere cosa viene eseguito e mostra lespansione degli argomenti, se un comando contiene la variabile, fa vedere il valore della variabile (come una modalit di debug) set +x Disattiva la modalit set -x
Scrivendo:
set -x for i in 1 2 3 4 5 6 > do > echo $i > done
si otterr lespansione del commando ed il risultato, ad esempio:
43 Sviluppo del software Un esempio di programma in linguaggio C, il file tombola.c #include <stdio.h> #include <sys/types.h> #include <unistd.h>
/*Programma per la estrazione di 90 numeri di tombola.*/
int main(int argc,char **argv) {
int n, m, nread, a=1; int tab[91]; char buffer[128];
pid_t pid = getpid(); /* Get our process ID */
srand((unsigned)pid);
for (n=1; n<=90; n++ ) { tab[n] = 0; }
for ( n=1; n<=10; n++ ) { printf("\n"); fflush(stdout); }
m = 0;
printf("Premi <Invio> per un'estrazione o Ctrl-C per uscire.\n");
while (a) { n = rand() % 90 + 1; /* 1 to 90 */ /* printf("%d\t%d.\n", n, tab[n]);*/ printf(""); if (tab[n]) { } else { tab[n] = 1; m++; nread = read(0,buffer,128); printf("L'estrazione numero %d e' \t%d.\n", m, n); for ( n=1; n<=10; n++ ) { printf("\n"); fflush(stdout); } };
if (m > 89) {a = 0;} } }
44 Comando Descrizione whereis gcc Visualizza la posizione di GCC, si tratta di un softlink a gcc, il compilatore GNU/Linux per il linguaggio C info gcc Apre una guida in formato pseudo-ipertesto, non si tratta di una struttura flat come il man, ma di un modello di ipertesto primordiale. Il tasto Invio consente di aprire un link (contrassegnato da *), q chiude il manuale, b torna allinizio
Il compilatore ha una lunga serie di opzioni. Su MacOS X si pu compilare con gcc ad esempio software per un Atari, per altri processori ed altre architetture (Cross Comiling).
In alcune pagine di manuale riportata la dicitura Fare riferimento alla documentazione mantenuta in formato info, il caso di gcc, la cui guida in formato info presenta contenuti pi aggiornati.
Alcune risorse utili: Manuale del Preprocessore C - http://gcc.gnu.org/onlinedocs/cpp/ Manuale del Compilatore GCC - http://gcc.gnu.org/onlinedocs/gcc/
Per inviare comandi al preprocessore si utilizza #
Per compilare un programma non sono necessarie opzioni aggiuntive, infatti sufficiente far seguire il nome del file sorgente al comando gcc. Dopo la compilazione viene prodotto un eseguibile denominato a.out Per evitare che leseguibile si chiami a.out possibile utilizzare uno switch del compilatore (con il termine switch si indica unopzione del compilatore).
Comando Descrizione gcc tombola.c Compila il programma tombola.c, leseguibile sar a.out gcc tombola.c -o tombola Compila il programma tombola.c, leseguibile sar tombola gcc sorgente.c -o destinazione Compila il programma sorgente.c, leseguibile sar destinazione
In Unix i file di intestazione sono contenuti nella cartella di default: /usr/include Per cercare, ad esempio, in quale file dintestazione si trova la funzione printf sufficiente eseguire:
grep -r printf /usr/include 2>/dev/null | wc
Si otterranno moltissimi risultati poich il comando cercher tutte le parole che contengono la stringa printf, si pu raffinare la ricerca:
45 E si otterranno 13 risultati. In essi compaiono anche quelli contenenti la stringa _printf poich il carattere underscore considerato separatore di parola. La ricerca pu essere perfezionata ancora:
Si otterr dunque che la funzione printf dichiarata nel file stdio.h Analogamente si pu cercare quale file di intestazione contiene la dichiarazione della funzione srand:
grep -r '\bsrand\b' /usr/include 2>/dev/null | wc
Ottenendo che srand definita nel file stdlib.h Tornando al file tombola.c, si pu notare che pur utilizzando la funzione srand, non sono stati inclusi riferimenti al file stdlib.h, ma molto probabile che qualche libreria allegata includa il file stdlib.h Esiste uno strumento in gcc che consente di vedere tutte le librerie caricate da un file, la catena degli include: gcc -H tombola.c
Restituir tutte le librerie incluse, visualizzate con un annidamento ad albero:
Si pu notare che non inclusa la libreria stdlib.h, tuttavia importante ricordare che se una funzione non stata definite, il C suppone che abbia unuscita intera e che non abbia variabili.
Ovviamente, per non avere risultati inattesi, importante controllare sempre che una funzione sia definita o che siano corretti i riferimenti di inclusione dei file che contengono la relativa definizione di funzione.
possibile fare in modo che il compilatore aiuti nella scelta delle librerie da includere nel sorgente, per fare ci necessario attivare i Warnings nel compilare, cio la visualizzazione degli avvisi relativi alla compilazione dei file.
46 gcc -Wall tombola.c -o tombola
Lopzione -W attiva i warnings, inoltre necessario specificare il livello di warnings desiderato: all mostrer tutti i gli avvisi. Compilando il file tombola.c, il compilatore restituir ora degli avvisi relativi alla dichiarazione implicita delle funzioni srand e rand. I programmi cos compilati non sono adatti al debugging, il debug si esegue con GDB (GNU Debugging) che consente di scovare facilmente gli errori nei programmi C. Esiste unopzione per compilare un programma in modo che si possa successivamente eseguire il debug:
gcc -g sorgente.c -o destinazione
Make ed il file Makefile I programmi C scritti da un principiante sono generalmente composti da un singolo file, il C per incoraggia a dividere il proprio codice sorgente in pi file, frequente infatti che un progetto di piccole dimensioni sia suddiviso in numerosi file. Non necessario che, in caso di modifica ad un singolo file, tutti i file debbano essere riprocessati per costruire leseguibile. In molti casi infatti sufficiente compilare un file .o (detto Object File). Esiste inoltre un albero delle dipendenze.
Uno strumento, in presenza di modifiche ai prerequisiti (file di partenza), apporta le modifiche esclusivamente alla parte interessata. Questo strumento MAKE ed stato creato dalla GNU Foundation. Quando si scarica un software Open Source, in genere si scaricano in sorgenti che devono essere compilati sulla macchina in uso e per fare ci necessario conoscere ed utilizzare MAKE. Make utilizza un file denominato Makefile (o MAKEFILE, una lista di dipendenze e di regole per lesatta risoluzione di queste dipendenze; quando si avvia MAKE, esso verifica nella Current Working Directory lesistenza del file Makefile. Tale file deve essere strutturato in una certa maniera, seguendo una specifica sintassi. Il secondo rigo del Makefile deve iniziare con un tabulatore, in caso di assenza, non funzionerebbe. Tra la regola (1 riga del file) e la dipendenza (2 riga) non devono esserci righe vuote.
Esempio di Makefile: testo : pezzo1.txt pezzo2.txt pezzo3.txt cat pezzo1.txt pezzo2.txt pezzo3.txt > testo.txt
Il compilatore seguir le dipendenze e compiler il file. Make verifica la data dei file (dei vari sottopezzi) e se trova una data successiva a quella del file compilato, compila la parte necessaria. Il programma make vale in generale, ad esempio potrebbe essere utilizzato da una redazione che ha un programma per assemblare gli articoli dei vari giornalisti e restituisce il giornale impaginato.
Inoltre se si scrive make tombola , make trova il file tombola.c (se presente nella CWD) e presume si voglia compilare il file. Nel caso in cui il file eseguibile sia presente ed aggiornato, il programma restituir:
make: 'tombola' is up to date.
Modificando il file tombola.c e rilanciando il comando
make tombola
Make intuisce euristicamente che si debba compilare il file C, lanciando automaticamente il comando:
cc tombola.c -o tombola
Make riconosce una serie di linguaggi di programmazione di default.
Per approfondimento si rimanda al libro Advanced Programming in the Unix Environment 82
In un makefile:
DIRS = definizione... Definizione di macro, tutto ci che a destra delluguale $(DIRS) Utilizzo delle variabili proprie di make $$i Utilizzo delle variabili dello shell
possibile che in un makefile ci siano i target ma non i prerequisiti.
Un esempio: all: $(MAKE) ./systype.sh macos: for i in $(DIRS); do \ (cd $$i && $(MAKE) -f macos.mk ) || exit 1; \ done
Con il comando seguente, si indica al make di utilizzare un makefile alternativo make -f
82 Advanced Programming in the Unix Environment - http://www.apuebook.com
#Our library that almos every program needs LIB=../libapue.a
# Common temp files to delete from each directory TEMPFILES=core core.* *.o temp.* *.out typescript*
La compilazione produce dei file .o, cio file oggetto. GCC per impostazione predefinita esegue anche il linking del programma, utilizzando invece lopzione -c , gcc si limiter alla sola compilazione dei file oggetto, non eseguendo il linking.
Con la macro seguente infatti, si impedir a gcc lesecuzione del linking:
COMPILE.c=$(CC) $(CFLAGS) $(CPPFLAGS) -c
Nel caso presentato, il linking viene ridefinito con una riga specifica, nella quale si indica al linker dove trovare le librerie personalizzate.
Lutente non pu inserire le proprie librerie nella directory /usr/lib ; in questa cartella (default per le librerie) solo lamministratore del sistema pu aggiungere nuove librerie.
Nellesempio presentato sono stati definiti tutti i flags da utilizzare nella compilazione, in particolare con la riga:
Dove con -ansi si impone al compilatore lutilizzo dello Standard C, infatti non saranno accettati sorgenti che non saranno conformi con lo standard ANSI C.
49 Le direttive del preprocessore possono essere passate da riga di comando con lopzione -D, nellesempio infatti si nota: -DMACOS $(EXTRA)
Make si blocca al primo errore incontrato e non esegue il resto delle operazioni, per continuare lesecuzione anche in caso di errori necessario utilizzare lopzione -i
make -i
Debug Per eseguire il debug di un file necessario compilarlo utilizzando una specifica modalit:
cc -ggdb tombola.c -o tombola
Per aprire il file in modalit debugging, eseguire:
gdb ./tombola
Allinterno del debugger possibile utilizzare una lista di comandi:
Comando Descrizione l Comando LIST, visualizza il sorgente C del programma (prime 10 righe). La ripetizione del comando consente di avanzare tra le righe del programma. b 20 Inserisce un breakpoint (punto dinterruzione nel programma) alla riga 20, vuol dire che il debugger eseguir il programma fino alla riga 24 esclusa. p nomevariabile possibile verificare il nome di una variabile scrivendo il comando p seguito dal nome di una variabile p &nomevariabile Visualizza lindirizzo di memoria della variabile nomevariabile s Comando STEP, esegue listruzione successiva e mostra al terminale la prossima clear 20 Elimina il breakpoint creato alla riga 20
Comandi vari Comando Descrizione ssh hplinux2.unisalento.it ls Esegue il comando ls sulla macchina remota ssh hplinux2.unisalento.it 'ps -e' Esegue il comando ps -e sulla macchina remota ssh hplinux2.unisalento.it 'uptime' Carico medio del sistema sulla macchina remota stty -echo Scrivi senza che il testo inserito sia visibile stty echo Ripristina lecho stty -a Visualizza tutte le associazioni
50 Comando Descrizione whereis sh Restituisce il percorso di sh: /bin/sh ls -la /bin/sh Restituisce le informazioni su /bin/sh -r-xr-xr-x 1 root wheel 1244960 Jun 18 2009 /bin/sh ls -lai /bin/sh Visualizza anche linode 1003466 -r-xr-xr-x 1 root wheel 1244960 Jun 18 2009 /bin/sh ls -lai /bin/bash Informazioni su /bin/bash 1003420 -rwxr-xr-x 1 root wheel 1244928 Jun 17 2009 /bin/bash
Per visualizzare il numero di tutti gli script contenuti nella cartella /etc Per visualizzare gli script shell (prima versione) grep -r '#!/bin/sh' /etc 2>/dev/null | wc
Per visualizzare gli script bash
grep -r '#!/bin/bash' /etc 2>/dev/null | wc
Cerca tutti gli script SH e restituisce il nome grep -r '#!/bin/sh' /etc 2>/dev/null
Esistono degli script periodici, situati nelle relative cartelle: daily, monthly, weekly. Lesecuzione di tali script regolata dal file periodic.conf Per visualizzare tale file con TextWrangler: edit /etc/defaults/periodic.conf
Il programma che esegue le azioni programmate periodic Comando Descrizione whereis periodic Restituir /usr/sbin/periodic edit /usr/sbin/periodic Visualizzare il contenuto dello script
possibile creare un file temporaneo scrivendo la riga: mktemp ${TMPDIR:-/tmp}/periodic.XXXXXXXXXX
Il comando eval 83 rivaluta lespressione che lo segue; esegue un ulteriore giro di valutazione. Quando si esegue il comando ps -ef per visualizzare la lista dei processi attivi, nelloutput del comando compaiono le colonne VSZ e RSZ che indicano:
83 Comando Eval - http://man.cx/eval
51 Virtual Size Set (VSZ) - Memoria virtuale occupata da un processo Real Size Set (RSZ) - Memoria reale occupata Si deve tenere presente che, ad esempio, le librerie C sono allocate una sola volta per tutti i processi che ne fanno richiesta, pertanto non sar possibile effettuare un conteggio accurato di quanta memoria occupa ciascun processo. Con il comando top possibile avere una visualizzazione dinamica dei processi con informazioni dettagliate su ciascun processo attivo. possibile avere una visualizzazione statica di top, eseguendo il comando: top -l1
Su MacOS X esiste il comando vmmap che produce una mappa della memoria virtuale. Su GNU/Linux invece, esiste una mappa della memoria per ogni processo, infatti in /proc esiste un file maps per ciascun processo attivo. Il comando curl consente di visualizzare siti web allinterno del terminale, di estrarre dati da essi oppure ancora, di visualizzare gli headers di una pagina web. Comando Descrizione curl http://www.google.it Restituisce il codice HTML della pagina web indicata curl -I http://www.google.it Restituisce gli Headers della pagina web indicata
possibile reindirizzare loutput del comando curl, ad esempio per scrivere gli headers di una pagina web allinterno di un file, cos facendo, curl visualizzer a terminale esclusivamente una statistica dei dati scaricati (che viene inviata allo stderr) mentre scriver nel file di testo indicato gli headers, come nel comando seguente. curl -I http://www.google.it 1>nomefile.txt
Conversione di date In alcune circostanze utile convertire una data dal formato standard al formato in secondi a partire da epoch (01/01/1970) cos da poter eseguire semplicemente confronti oppure ordinamenti. Si tenga presente che il formato di visualizzazione della data condizionato dalle impostazioni sulla localizzazione. In Mac OS X per passare dalloutput del comando date ad epoch, con localizzazione en-US date -j -f "%a %b %d %T %Z %Y" "$(date)" +%s
In Mac OS X per passare dalloutput del comando date ad epoch, con localizzazione it-IT date -j -f "%a %b %d %Y %T %Z" "$(date)" +%s
Per verificare la localizzazione del terminale della macchina in uso, utilizzare il comando locale
52 Su un terminale Linux per passare dalloutput del comando date ad epoch, con localizzazione en-US date -d "$(date)" +%s
Loutput del comando: ps -cax -opid,lstart
che visualizza listante di inizio di un processo, fornisce la data nel formato 84 : "%a %m %b %T %Y
Per cui il comando di conversione in Mac OS X : date -j -f "%a %m %b %T %Y" "Dom 3 Apr 10:25:14 2011" +%s
Su unaltra macchina con localizzazione differente : date -j -f "%a %d %b %Y %T %Z" "$(date)" "+%s"
poich il comando date restituiva: Mar 19 Giu 2012 15:34:06 CEST Per far funzionare il comando con i risultati restituiti dal comando curl quando sono in inglese, possibile cambiare la localizzazione del tempo solo per lesecuzione del comando: LC_TIME="en_US.UTF-8" date -j -f "%a, %d %b %Y %T %Z" "Thu, 05 Jan 2012 18:12:40 GMT" "+%s"
Che risolve la seguente linea di header: Last-Modified: Thu, 05 Jan 2012 18:12:40 GMT
in: 1325787160
Per modifica la localizzazione delle date: Comando Descrizione LC_TIME="en_US.UTF-8" Imposta la visualizzazione delle date in formato inglese USA LC_TIME="it_IT.UTF-8" Imposta la visualizzazione delle date in formato italiano
84 Fare riferimento al manuale del comando date - http://man.cx/date
53 Per visualizzare la priorit dei processi attivi: ps -e -o pid,nice,comm
Per conoscerla priorit del processo mdworker ps -e -o pid,nice,comm | grep md
Tale processo, che si occupa dellindicizzazione dei file presenti sul pc, ha una priorit (numero di nice) pari a 17 su un massimo di 20, quindi priorit molto bassa. Il numero di nice compreso tra -20 (priorit altissima) e 20 (priorit bassissima). possibile visualizzare la priorit dei processi anche utilizzando il comando seguente: ps axl
54 Simulazioni desame
Esercizio Scrivere in bash un loop che incrementi una variabile e stampare il valore di tale variabile dopo un secondo. contagiri.sh #!/bin/bash
i=0
trap 'echo $i; i=0' SIGUSR1
./trigger.sh $$ & # lancia lo script, prende come argomento il PID del bash e lo pone in background
while true do ((i++)) done
trigger.sh #!/bin/bash
while true do sleep 1 kill -SIGUSR1 $1 done
Esercizio Scrivere uno script bash in grado di fornire una rappresentazione grafica della bitmap degli inode nel file system in cui si trova la propria home directory indicando con una 'x' gli inode occupati e con un '.' quelli liberi.
Innanzitutto bene conoscere qualche comando: Comando Descrizione df -k Visualizza i volumi montati df -i Volumi occupati, saranno visualizzati anche gli inode
possibile visualizzare ad esempio un range di inode:
for ((i=inode_start; i<=inode_end; i++)); do b[i]=.; done for i in ${a[*]}; do b[i]=x; done for ((i=inode_start; i<=inode_end; i++)); do echo ${b[i]}; done | rs -g 0 50