SaLUG! @ Manifatture KNOS
22 Gennaio 2015
Unix ha origine come sistema operativo text-based
(dette CLI) e la shell e' stata la sua prima interfaccia utente
Una shell e' un'applicazione che accetta ed interpreta comandi testuali
La modalita' testuale NON e' una modalita' primitiva o sorpassata
soprattutto in ambito server ed embedded dove spesso non sono disponibili interfacce utente di tipo grafico (dette GUI)
Esistono diverse shell, le piu' comuni sono
- Bash (Bourne Again Shell)
- Zsh (Z Shell)
I sistemi Unix eseguono automaticamente la shell di default dell'utente quanto viene effettuato un login dall'interfaccia testuale
Le shell Unix supportano due modalita':
- Batch o Scripting
- Interattiva
Nella sua modalita' interattiva, la shell esegue il ciclo:
- presenta un prompt all'utente (in genere '$' o '#' a seconda del livello di utenza)
- legge un comando (read)
- lo esegue (eval)
- ritorna al passo 1
Il prompt standard presenta alcune informazioni utili sullo stato della shell interattiva in uso:
bob@lx101:~$ ls
...
la directory corrente "~" (tilde) rappresenta in modo sintetico la directory home dell'utente (che di default sara' /home/nomeutente)
La shell interattiva mantiene una lista dei comandi inseriti, e la shell ci consentira':
$ history
...
- visualizzare l'intera lista (mediante il comandi history)
- la navigazione dei comandi della history (mediante i tasti freccia)
- la ricerca di un comando in history (mediante la combinazione Ctrl-r)
I comandi di shell validi si dividono principalmente in:
interni
I comandi interni sono costituiti da un ridotto set di comandi integrati ed interpretati direttamente dallla shell
esterni
I comandi esterni sono file eseguibili presenti in uno dei percorsi di ricerca degli eseguibili configurati
Tra i comandi interni troviamo:
cd, pwd, echo, source, fg, bg, type, ...
perche' espongono meccanismi interni alla shell o per questioni di performance.
$ type ...
Un concetto molto importante da conoscere e comprendere e' l'environment:
costituito dall'insieme delle variabili d'ambiente
Una variabile d'ambiente non e' altro che una stringa a cui viene assegnato un valore.
export
$ MYVAR=value
$ export MYVAR
$ echo $MYVAR
value
env
Il comando env consente di visualizzare o modificare l'environment
$ env
...
unset
di una variabile d'ambienteCon il comando unset e' possibile rimuovere le variabili d'ambiente
$ unset VAR
PATH
La variabile d'ambiente PATH determina quali percorsi (path) saranno utilizzati per la ricerca dei comandi disponibili.
$ echo $PATH
...
which
Mediante il comando which (o anche con type) e' possibile determinare in quale percorso verra' risolto un comando esterno.
$ which bash
...
Modificare i percorsi di ricerca dei comandi esterni, mediante modifica della variabile d'ambiente PATH e dei comandi echo/which/export per visualizzare e manipolarne lo stato
$ echo $PATH
...
$ which ps
/bin/ps
$ cp /bin/ps .
$ cp /bin/ps myps
$ export PATH=$PATH:~
$ which ps
/bin/ps
$ which myps
/home/bob/myps
Per rendere persistenti le modifiche all'environment e' possibile utilizzare dei file di configurazione.
ad esempio per bash (la shell piu' comune):
~/.profile
e~/.bashrc
: configurazione utente della shell/etc/profile
e/etc/profile.d/*.sh
: configurazione globale della shell
Molti comandi accettano un gran numero di opzioni e argomenti
Le opzioni spesso possono utilizzare una sintassi breve (un solo carattere) o estesa, e in alcuni casi possono accettare o richiedere un valore
- i comandi man e info danno accesso rispettivamente alle pagine di manuale e di documentazione ipertestuale
- molti comandi fornisco un output di aiuto con le opzioni -h e/o --help
- Molti dei pacchetti installati forniscono ulteriore documentazione in /usr/share/doc
I file sono organizzati in una struttura gerarchica ad albero, che ha la sua origine nella directory radice (directory root) determinata dal carattere "/"
per separare le directory si utilizza il simbolo "/"
e non il backslash ("\") utilizzato dai sistemi Windows
I filesystem Unix (e Linux non fa eccezione), sono di solito case-sentitive
In altre parole:
test.txt
,TEST.txt
eTest.txt
rappresentano percorsi differenti
"." e ".." sono due file speciali presenti in ogni directory
e si riferiscono rispettivamente alla directory corrente (".")
e alla directory padre ("..") della directory corrente
Inoltre tutti i nomi file che iniziano con "." sono per convenzione considerati file nascosti e non sono visualizzati dal comando ls se non viene specificata l'opzione "-a"
ls
, pwd
e cd
$ pwd
...
$ ls
...
$ ls -la
...
$ cd .
$ pwd
...
$ cd ..
$ pwd
...
$ mkdir testdir
$ cp /etc/profile testdir/
$ cp -rf /etc/profile.d testdir/
$ mv testdir backup
$ rmdir backup
$ mkdir -p backup/new/empty
$ rmdir backup/new/empty
$ rm -rf backup
- rmdir rimuovera' solo le directory vuote
- l'opzione -rf si traduce come "forzatamente e ricorsivamente"
- mkdir -p crea le directory parent se non esistono
Un path e' la codifica del percorso da seguire per raggiungere un determinato file o directory
i path possono essere
- assoluti: quando partono dalla directory radice "/"
- relativi: quando partono dalla directory corrente
/home/rpl/PROJECTS.org
e' assoluto o relativo?
build/run.sh
e' assoluto o relativo?
./build/run.sh
e build/run.sh
rappresentano lo stesso percorso?
ls ../../src/project01/images/
Le shell Unix supportano l'espansione di alcuni caratteri speciali allo scopo di identificare gruppi di file in maniera sintetica:
$ ls *.js
'*' verra' espanso con zero o piu' caratteri qualunque
$ ls img-00?.png
'?' verra' espanso con un solo carattere qualunque
$ ls img00[1-9].jpg
'[1-9]' verra' espanso con i soli caratteri da 1 a 9
Durante l'uso interattivo le shell Unix supportano l'auto-completamento di comandi e percorsi
$ ls -l /etc/prof<TAB>
find
$ find /etc -iname *bash*
...
$ cp /etc/profile .
$ find . -ctime 0 -exec ls -l {} \;
- l'opzione -iname cerca il pattern seguente in modo case-insensitive
- l'opzione -exec consente di eseguire un comando su ciascuno dei risultati
- find supporta molte altre opzioni di ricerca (per utente, per data etc)
tar
$ cp -rf /etc/vim ./backup-vim-config
$ tar czvf backup-vim-config.tar.gz ./backup-vim-config
...
$ tar cjvf backup-vim-config.tar.bz2 ./backup-vim-config
...
$ mkdir restore ; cd restore
$ tar xvf ../backup-vim-config.tar.bz2
- mediante il comando tar e' possibile archiviare in un unico file un insieme di file e directory
- attraverso tool di compressione esterni (come gzip e bzip2) e' possibile ridurre la dimensione del file archivio