Prima di scrivere questo paragrafo, proprio in questo punto del programma, devo dire di averci pensato un bel po'.
Il dubbio mi viene dal fatto che non vorrei che si pensasse che Linux, alla fine, si riducesse ad una serie di comandi che servono per compiere alcune operazioni di base, in realtà Linux è molto di più.
Pertanto in questo paragrafo si daranno, sotto la forma di un glossario, alcune infomazioni che vi serviranno per muovervi un po' più agevolmente nel sistema, ma non si farà menzione dei comandi avanzati, di cui parleremo solo più avanti. Considerate questa parte del programma culturale come un punto di partenza e non un punto di arrivo.
Infine un consiglio: il modo migliore per apprendere Linux è quello di usarlo, per cui non fate l'errore di leggere solo e non lavorare sul sistema, usate queste informazioni per far funzionare il vostro Linux, insomma sperimentate il più possibile.
cat [options] nomefile
elenca il contenuto di un file
Il suo output è normalmente stdout, ciò non toglie che possa anche essere rediretto ad esempio in un altro file.
Es: cat pippo.dat > pluto.dat
copia il contenuto del file pippo.dat
nel file pluto.dat
Es: cat pippo.dat > /dev/lp1
copia il contenuto del file pippo.dat
nel file speciale
/dev/lp1
che indica la porta parallela. (A cui per esempio può
essere connessa una stampante)
Es: cat pippo pero > new.file
copia il contenuto del file pippo
e del file pero
, sequenzialmente
nel file new.file
cat
è dotato anche di alcune interessanti opzioni, che gli
consentono ad esempio di numerare le linee in output, di numerare
tutte le linee non bianche etc etc.
per maggiori info sulle opzioni del comando cat
, vi
consiglio vivamente ``man cat
''.
cp [options] nomeorg nomedest
copia un file da una locazione ad un altra
Es: cp /root/doc/info.for.root /home/jaco/doc/
copia il file info.for.root
dalla directory /root/doc/
alla directory /home/jaco/doc/
Es:
cp /root/doc/info.for.root /home/jaco/doc/info.for.jaco
copia il file info.for.root
dalla directory /root/doc/
alla directory /home/jaco/doc/
rinominandolo info.for.jaco
Anche il comando cp
, come gli altri è dotato di un
grande numero di opzioni
Es: cp -R /root/ /temp/
copia la directory root
e tutte le sue sottodirectory nella
directory /tmp/
anche in questo caso per le opzioni di cp
, leggere attentamente
``man cp
''
find [path] [expression]
cerca un file all'interno del file system
Es: find / -iname pippo.pero
cerca a partire dalla directory radice tutti i file che
corrispondono alla descrizione pippo.pero
.
L'opzione -iname
fa sì che la ricerca sia case insensitive,
ovvero che non si preoccupi di vedere se il file è Pippo.Pero
o piPPo.peRo
.
Ricordiamo invece che Linux è case sensitive e che quindi
in generale il file pluto
è diverso dal file PLUTO
, ovvero
tutti e due possono convivere nella stessa directory,
indicando però file diversi.
Es: find /usr -iname pluto
come prima solo che questa volta la ricerca sarà effettuata
nella sola dir /usr
e nelle sue sottodirectory.
Es: find . -type f -perm -755 -print
cerca a partire dalla directory .
(la directory corrente)
tutti i file (non le dir) il cui permesso è 755 e stampa
il pathname del file trovato.
Es:
find . -type f -perm -755 -print -exec chmod 750 {} ';'
cerca a partire dalla directory corrente tutti file aventi permesso 755 e ne cambia il permesso a 750.
Come vedete, find
ha una marea di opzioni, quindi qui occorre
uno studio veramente approfondito di ``man find
''.
grep [options] pattern [file]
grep
ricerca in un file la stringa specificata in pattern
Es: grep -i linux documentation
ricerca all'interno del file documentation
la stringa linux
ignorando la distinzione fra maiuscole e minuscole.
Es: grep -i linux *
ricerca all'interno di ogni file la stringa linux
Es: mialista=`grep linux *`
ricerca all'interno di ogni file la stringa linux
e
crea una variabile di sistema chiamata mialista
che contenga l'elenco delle occorrenze trovate da grep
ls [options] [pathfile]
elenca il contenuto di una directory
total 656
-rw------- 1 root root 21253 Dec 11 11:28 123gate.txt
-rw-r--r-- 1 root root 168814 Jan 11 08:30 ALLFILES.LST
-rw-rw-r-- 1 root root 185123 Nov 15 04:51 ALLFILES.TXT
-rw-r--r-- 1 root root 7203 Dec 11 23:18 CLS-ED
-rw------- 1 root root 64039 Jan 12 09:42 allfiles.ziq
-rw------- 1 root root 56771 Jan 12 09:42 allfiles.zir
drwxr-xr-x 2 root root 1024 Nov 7 15:52 cucina
-rw-r--r-- 1 root root 140024 Nov 2 00:05 ifmail-h
-rw----rw- 1 root root 15294 Jan 11 14:33 prg.culturale.1
-rw-r--r-- 1 root root 1170 Jan 9 15:17 mtemp
mkdir nomedir
crea una nuova directory
mv nomeorg nomedest
muove un file da una locazione all'altra nell'hd
Es: mv /var/spool/pippero /doc/
muove il file pippero
dalla directory /var/spool/
alla directory /doc/
Es: mv pluto pippo
rinomina il file pluto
come file pippo
tail [+/-num][-f] file
stampa l'ultima parte di un file
Per default vengono stampate le ultime 10 righe.
L'opzione -f
risulta molto utile perché consente di vedere un file in
crescita, ad esempio un file di log è in continua costruzione, con
``tail -f /var/adm/messages
'' vedrete in tempo reale i
messaggi di sistema che vengono aggiunti al file /var/adm/messages
.
Cercheremo qui di semplificare molto il processo di inizializzazione del sistema, ci servirà solo per dare un idea di quali sono i file che vengono eseguiti all'avvio del sistema operativo, e non per sapere tecnicamente quello che avviene a basso livello durante il bootstrap.
Il primo processo che viene considerato dopo il bootstrap è init
che va
a leggere il file /etc/inittab
. (La directory /etc/
,
tipicamente contiene tutti o quasi tutti i file necessari per la
configurazione generale del sistema.)
/etc/inittab
è un file di testo che contiene i comandi che il
processo init
(padre di tutti i processi del sistema) deve
eseguire per far partire i processi figli.
tipicamente una riga del file /etc/inittab
è così composta
ID:LIVELLODIESECUZIONE:AZIONE:COMANDO
ID
è una stringa di due caratteri, che identifica univocamente
un elemento del file.
Ciò naturalmente significa che un ID
può comparire solo
su una riga ovvero non ci possonno essere due ID
doppioni
in /etc/inittab
.
LIVELLODIESECUZIONE
I livelli di esecuzione possono sembrare una cosa molto astratta,
in realtà non lo sono affatto.
Diciamo che Linux dispone di 7 livelli di esecuzione, ciascuno dei
quali potrà essere utilizzato indifferentemente o generato da
una chiamata di sistema di un programma.
Specificare il livello di esecuzione per un comando nel file
/etc/inittab
significa dire al sistema operativo che quel
comando deve essere eseguito quando si passa da un livello
al livello specificato.
Alcuni livelli di esecuzione in generale:
si passa al livello 0 quando si esegue lo shutdown del sistema
si passa al livello 1 quando si vada da modo multiuser a modo singleuser
definisce lo stato multiutente
si usano spesso in alternativa all'ambiente multiutente, ad esempio in una rete il 3 potrebbe indicare lo stato di rete ed eseguire quindi tutti i compiti dello stato 2 ed inizializzare anche i processi client e server della rete
Potrebbe essere usato per eseguire uno shutdown completo della macchina e poi restituire il controllo ad un debbugger
il sistema esegue uno shut-down completo poi viene fatto ripartire
C'è da dire che la definizione dei livelli non è standard, ma può essere ridefinita, tanto è vero che spesso cambia anche da distribuzione a distribuzione.
AZIONE
un'azione associata ad un comando.
Ad esempio l'azione respawn
fa sì che il comando riparta di nuovo
ogni volta che esso per un qualunque motivo termina.
COMANDO
un qualsiasi comando della shell.
e vediamo ora un esempio significativo del file /etc/inittab
# Script to run when going single user (runlevel 1). su:1S:wait:/etc/rc.d/rc.K # quando passo al livello 1 (single user) viene eseguito lo # script /etc/rc.d/rc.K # What to do at the "Three Finger Salute". ca::ctrlaltdel:/sbin/shutdown -t5 -rfn now # se qualcuno preme ctrl-alt-del a qualunque livello siamo, # esegui uno shutdown del sistema # Runlevel 0 halts the system. l0:0:wait:/etc/rc.d/rc.0 # se si passa al livello 0 (shutdown + halt system) allora esegui # lo script /etc/rc.d/rc.0 # Runlevel 6 reboots the system. l6:6:wait:/etc/rc.d/rc.6 # se si passa a livello 6 (shutdown + reboot) allora esegui # /etc/rc.d/rc.6 c1:1235:respawn:/sbin/agetty 38400 tty1 linux c2:1235:respawn:/sbin/agetty 38400 tty2 linux c3:5:respawn:/sbin/agetty 38400 tty3 linux c4:5:respawn:/sbin/agetty 38400 tty4 linux c5:5:respawn:/sbin/agetty 38400 tty5 linux c6:45:respawn:/sbin/agetty 38400 tty6 linux c8:45:respawn:/sbin/agetty 38400 tty8 linux c9:45:respawn:/sbin/agetty 38400 tty9 linux z1:45:respawn:/sbin/agetty 38400 tty10 linux z2:45:respawn:/sbin/agetty 38400 tty11 linux # inizializza i terminali utenti da 1 a 6 e da 8 a 11 e manda # il login su ciascuno di questi terminali, respawn fa si che # quando un terminale viene disconesso, automaticamente viene # mandato un altro login. # quando il livello di esecuzione non e' specificato, si assume # 0123456 ovvero tutti i livelli di esecuzione # quando il sistema viene inizializzato in modo multiutente, # in inittab esiste una linea del tipo # Script to run when going multi user. rc:123456:wait:/etc/rc.d/rc.M # per cui praticamente inittab ad ogni bootstrap richiama # lo script /etc/rc.M che esegue una serie di operazioni, # tipo richiamare il demone per la posta, fare il mount # del cd-rom (ultima slakware) e molte altre.
Fra tutte richiama anche il file /etc/rc.d/rc.local
che tipicamente contiene tutte le operazioni locali,
diciamo una specie di autoexec
del dos.
Ad esempio un buon rc.local
contiene:
#!/bin/sh # # /etc/rc.d/rc.local: Local system initialization script. # # Put any local setup commands in here: echo "Running gpm..." /usr/bin/gpm -t bare & echo "Sto caricando la tastiera italiana .... " /usr/bin/loadkeys /usr/lib/kbd/keytables/it.map che praticamente chiama il programma di controllo del mouse e carica il driver per la tastiera italiana /usr/bin/loadkeys /usr/lib/kbd/keytables/it.map