Title: Shells and Commands
1Shells and Commands
2Le shell
- Una shell è un programma di interfaccia tra lo
utente e il sistema operativo. - Linterazione è mediata da comandi che possono
essere dati o in maniera interattiva o
raggruppati in un file di testo, detto script, ed
eseguiti come un singolo programma. - Esistono molte shell che però si riconducono a 3
famiglie principali - Bourne shell sh, bash
- C shell csh, tcsh
- Korn shell ksh, zsh
- Ogni famiglia è omogenea a livello di script
(salvo poche eccezioni) ma cambiano le
possibilità di editing dei comandi interattivi
(richiamo dei comandi precedenti, completamento
automatico dei nomi, etc.).
3man
- man mostra una pagina di documentazione su un
comando Unix. - In VMS help
- Uso man comando
- Esempio gt man man
- E se non conosco comando ?
- gt man -k keyword
- Esempio voglio cambiare la mia password, che
comando devo usare? - gt man -k password
- chpasswd (8) - update password file in batch
- passwd (1) - update a users password
- userpasswd (1) - a graphical tool to change
password - N.B. di solito in fondo alla pagina man esiste la
sezione SEE ALSO con una lista di comandi
correlati.
4ls
- ls mostra la lista dei file in una directory.
- In VMS dir
- Uso ls directory
- Default directory corrente.
- Esempio
- gt ls /usr/local/doc
- mtv.html mysql uushred
- xanim.doc
- Lopzione -l mostra le caratteristiche (tipo,
- dimensione, data di modifica, ecc.) dei file
- gt ls -l /usr/local/doc
- total 64
- -rwxr-xr-x 1 root root 22629 Aug 30 1997 mtv.html
- drwxr-xr-x 4 root root 1024 Sep 15 1997 mysql
- drwxr-xr-x 2 root root 1024 Jul 14 1997 uushred
- -rw-r--r-- 1 root root 37481 Jan 26 1997
xanim.doc
5cd / pwd
- cd cambia la directory di lavoro.
- In VMS set def
- Uso cd directory
- Default user home directory.
- Directory particolari
- User home directory (cd cd)
- / Root directory del nodo
- . Directory corrente
- .. Directory madre della directory corrente
- Per sapere in che directory ci si trova pwd
- gt cd
- gt pwd
- /mnt/sda6/home/leonardi
6cat / more / less
- cat visualizza uno o più file di testo.
- In VMS type
- Uso cat file1 file2 file3...
- I file vengono mostrati sequenzialmente. Utile
anche per fare il merging di più file. - Esempio
- gt cat list1.dat list2.data gt listona.dat
- more e less aggiungono a cat funzioni di
paginazione (stile type /page in VMS ma con più
possibilità) e ricerca. - Tasti utili
- ltReturngt Avanza di una riga
- ltSpaziogt Avanza di una pagina
- lt?gt o lthgt Mostra i comandi disponibili
7ln
- ln crea un link (puntatore) a un file
pre-esistente. - Può funzionare in modalità hard (se il file
originale viene cancellato il link ne conserva
una copia) o soft (se il file originale viene
cancellato il link rimane ma dà un errore se si
prova ad usarlo). - Uso ln -s file link
- Se si usa il parametro -s il link è soft,
altrimenti è hard. - Esempio
- gt ln -s /opt/lsf /bin/lsf
- gt ls -l /bin
- lrwxr-xr-x 1 leonardi ec 28 lsf -gt /opt/lsf
8who / which / whereis
- who mostra gli user loggati sulla macchina.
- In VMS show user
- Esempio
- gt who
- root ttyp1 Nov 1 1739 (0.0)
- leonardi ttyp6 Nov 1 1753 (echosl)
- which mostra dove si trova un comando.
- Esempio
- gt which gnuchess
- /usr/bin/gnuchess
- whereis mostra anche la posizione del file man
corrispondente. - Esempio
- gt whereis ls
- ls /bin/ls /usr/man/man1/ls.1
9uname
- uname mostra le caratteristiche del computer che
si sta usando. - Opzioni
- -n nome del nodo
- -m architettura
- -s sistema operativo (default)
- -r release
- -a tutto
- Esempi
- enderleonardigt uname
- Linux
- enderleonardigt uname -snrm
- Linux ender 2.0.34 i586
- enderleonardigt uname -a
- Linux ender 2.0.34 i586
- uname è molto utile negli script!
10ps / kill
- ps mostra i processi attivi sulla macchina.
- Di default mostra solo i processi associati alla
sessione corrente. - Per vedere tutti i processi sulla macchina usare
ps -ef (HP, DEC, Solaris) o ps aux (SunOS,
Linux, DEC). - gt ps -ef
- UID PID PPID STIME TTY S TIME COMM
- root 7400 7389 160725 ttyp5 S 000.32 tcsh
-
- kill manda un segnale ad un processo.
- Default manda al processo il segnale TERM(inate)
invitandolo a terminare. - gt kill 7400 (invita 7400 a terminare)
- Se il processo 7400 è ancora presente provare
con - gt kill -9 7400 (uccidi 7400)
11Variabili di Ambiente
- Le Variabili di Ambiente (Environment Variables)
permettono di accedere ed eventualmente
modificare alcuni parametri che regolano il
comportamento di un processo Unix. - Alcune variabili utili sono
- TERM tipo di terminale usato (xterm,vt100,)
- SHELL tipo di shell in uso (sh,csh,ksh,)
- USER nome dellaccount in uso
- HOSTNAME nome dellhost su cui si sta lavorando
- DISPLAY schermo su cui vengono mandate le
finestre grafiche - PATH lista delle directory in cui cercare i
comandi da eseguire - MANPATH lista delle directory in cui cercare i
file di documentazione usati da man
12printenv / setenv
- printenv mostra una o più delle variabili di
ambiente definite nel processo corrente. - Di default mostra la lista completa delle
variabili. - gt printenv TERM
- xterm
- Per cambiare il valore di una variabile di
ambiente il comando cambia a seconda della shell
usata. - Per csh, tcsh
- gt setenv DISPLAY myxterm0
- Per sh, bash, ksh, zsh
- gt DISPLAYmyxterm0
- gt export DISPLAY
- N.B. tutte le variabili di ambiente di un
processo vengono ereditate dai processi che esso
genera.
13alias
- Un alias è un nuovo comando definito in funzione
dei comandi di sistema. - Viene creato con
- gt alias llls -l sh, bash, ksh, zsh
- gt alias ll ls -l csh, tcsh
- Una volta creato, un alias può essere utilizzato
come qualsiasi altro comando di sistema. - gt ll /usr/local/doc
- total 64
- -rwxr-xr-x 1 root root 22629 Aug 30 1997 mtv.html
- drwxr-xr-x 4 root root 1024 Sep 15 1997 mysql
- drwxr-xr-x 2 root root 1024 Jul 14 1997 uushred
- -rw-r--r-- 1 root root 37481 Jan 26 1997
xanim.doc - Per eliminare un alias scomodo esiste il
comando unalias. - gt unalias ll
14Ridirezione dellI/O
- Di default linput e loutput di un comando sono
collegati al terminale su cui gira la shell. - gt myMC.exe
- How many events ? 100
- 100 events produced. End
- gt
- Tutte le shell permettono però di ridirigere
lI/O su un file usando gt per loutput e lt per
linput. - gt echo 100 gt events.dat
- gt myMC.exe lt events.dat gt myMC.log
- gt cat myMC.log
- How many events ?
- 100 events produced. End
- gt
- LI/O può anche essere ridiretto su una pipe.
- gt echo 100 myMC.exe gt myMC.log
15Controllo dei Processi
- I comandi possono essere eseguiti in background,
ossia senza tenere bloccata la shell mentre il
comando viene eseguito. Per fare questo è
sufficiente aggiungere in fondo alla linea. - Il comando jobs mostra una lista dei processi
posti in background dalla shell corrente. - Un job in background può essere riportato in
foreground (ossia in modalità interattiva) con il
comando fg. - Un job interattivo può essere mandato in
background sospendendolo e dando il comando bg
(si veda lesempio).
16Controllo dei processi esempio
- gt myMC.exe ltevents.dat gtmyMC.log
- 1 1834
- gt
- (grazie al alla fine il comando viene eseguito
in background. Il prompt ricompare
immediatamente) - gt jobs
- 1 Running myMC.exe ltevents.dat gtmyMC.log
- gt
- (il comando jobs mostra che il processo sta
effettivamente girando in background) - gt fg 1
- myMC.exe ltevents.dat gtmyMC.log
- (con fg il job viene riportato in foreground. Il
prompt ricomparirà solo alla fine dellesecuzione
del comando) - Z
- Suspended
- gt bg
- 1 myMC.exe ltevents.dat gtmyMC.log
- (il Z, i.e. CTRL-Z, sospende il job in
foreground e mostra il prompt. Il comando bg
mette in background il job sospeso)
17Script di login
- Quando si apre una nuova sessione vengono
eseguiti degli script standard che servono per
configurare il proprio ambiente di lavoro. Questi
script si trovano nella propria home directory e
contengono di solito - Settaggi di variabili di ambiente
- Definizioni di alias
- Configurazione del comportamento della shell
- Al momento del login viene eseguito
- .profile sh, ksh, bash
- .zprofile zsh
- .login csh, tcsh
- Quando parte una shell (anche non di login)
- .bashrc bash
- .zshrc zsh
- .cshrc csh (e tcsh se non esiste .tcshrc)
- .tcshrc tcsh
- N.B. al login viene prima eseguito il file rc e
poi quello di login. P.es. prima .cshrc e poi
.login
18Esempio .login
- Esempio di file .login
- Le righe che iniziano con sono commenti
- Configura le variabili di ambiente
- setenv PATH ./bin/usr/bin/cern/bin
- setenv MANPATH /usr/man/usr/local/man
- setenv EDITOR emacs
- Scegli la stampante da usare in funzione
- della macchina su cui ci troviamo
- switch (uname -n)
- case hpl3rom1
- setenv PRINTER lwl3ps
- breaksw
- case trantor
- setenv PRINTER babarlj
- breaksw
- default
- setenv PRINTER siclas
19Esempio .cshrc
- Esempio di file .cshrc
- Configura il comportamento della shell
- set history20
- set savehist20
- set promptEmanuelegt
- Definisci gli alias utili (e nostalgici! -)
- alias dir ls -Al
- alias up cd .. pwd
- alias down cd \! pwd
- Esegui altri script di inizializzazione
- switch (uname -n)
- case hpl3rom1
- source /l3/script/l3init.csh
- breaksw
- case trantor
- source \
20Shell Script un Esempio (1)
Problema rinominare tutti gli eseguibili della
directory corrente.Soluzione uso del costrutto
di iterazione.
!/bin/tcsh this is a comment foreach i ()
if( -x i ) then echo "moving i" mv i
i.old endif end
!/bin/sh this too for i in do if -x i
then echo "moving i" mv i i.old
fi done
- nelle shell moderne alcuni comandi sono built-in
command (if,foreach,echo), altri sono eseguibili
esterni (mv) - i built-in command e le sintassi sono molto
simili tra le varie shell - si possono usare potenti costrutti di iterazione
- attenzione alla differenza tra ' e " riguardo
all'espansione delle variabili di shell
21Shell Script un Esempio (2)
Problema esecuzione condizionata
multipla.Soluzione uso del costrutto
switch/case.
!/bin/csh ... switch ("1") case start echo
"let's do it." breaksw case stop echo
stop it!" breaksw default echo "bad
syntax!!" breaksw endsw ...
!/bin/sh ... case "1" in start) echo
"let's do it. stop) echo stop
it!" ) echo "bad syntax!!" esac ...
Esempio gt myscript start lets do it. gt myscript
stop stop it! gt myscript pippo bad syntax!!
22find
find permette la cercare file in un file system
in base alle loro proprietà (nome, tipo,
attributi, ownership, ...). Cerca nella
directory corrente (.) e in tutte le sue
sottodirectory un file di nome simula.dat. gt
find . -name simula.dat -print ./montecarlo/data/s
imula.dat ./olddata/simula.dat Cerca nellalbero
di directory /usr tutti i file con estensione
.dat. gt find /usr -name \.dat -print /usr/games/d
oom.dat /usr/lib/netscape/mime.dat Il backslash
(\) è necessarioper impedire che la shell
interpreti i caratteri spaciali (in questo caso
). N.B. Il flag -print in alcuni sistemi è il
default ma in altri è necessario.
23Shell Script un Esempio (3)
Problema rinominare tutti gli eseguibili di un
albero di directory. Soluzione uso del comando
find
- Mettendo insieme i precedenti esempi
- !/bin/sh
- BINLISTfind 1 -perm 0111 -and ! -type d
- for i in BINLIST do
- mv i i.old
- done
- dove la condizione di ricerca e l'AND (-and) tra
la presenza dell' execute bit (-perm 0111) e dal
fatto di non essere una directory (! -type d). - In alternativa si può usare il flag -exec che
permette a find di eseguire un comando sui file
trovati - gt cd somewhere
- gt find . -perm 0111 -and ! -type d -exec mv
"".old \ - il sarà sostituito con ciascuno dei file
individuati da find. - il \ identifica la fine del comando introdotto
da -exec. - attenzione alle che proteggono nel nome
composto