230 likes | 322 Views
Shells and Commands. Emanuele Leonardi. Le shell. Una shell è un programma di interfaccia tra lo utente e il sistema operativo.
E N D
Shells and Commands Emanuele Leonardi
Le shell • Una shell è un programma di interfaccia tra lo utente e il sistema operativo. • L’interazione è 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.).
man • man mostra una pagina di documentazione su un comando Unix. • In VMS: help • Uso: man comando • Esempio: > man man • E se non conosco “comando” ? • > man -k keyword • Esempio: voglio cambiare la mia password, che comando devo usare? • > man -k password • chpasswd (8) - update password file in batch • passwd (1) - update a user’s 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.
ls • ls mostra la lista dei file in una directory. • In VMS: dir • Uso: ls [directory ] • Default: directory corrente. • Esempio: • > ls /usr/local/doc • mtv.html mysql uushred • xanim.doc • L’opzione -l mostra le caratteristiche (tipo, • dimensione, data di modifica, ecc.) dei file: • > 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
cd / 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 • > cd • > pwd • /mnt/sda6/home/leonardi
cat / 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: • > cat list1.dat list2.data > listona.dat • more e less aggiungono a cat funzioni di paginazione (stile type /page in VMS ma con più possibilità) e ricerca. • Tasti utili: • <Return> Avanza di una riga • <Spazio> Avanza di una pagina • <?> o <h> Mostra i comandi disponibili
ln • 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: • > ln -s /opt/lsf ˜/bin/lsf • > ls -l ˜/bin • lrwxr-xr-x 1 leonardi ec 28 lsf -> /opt/lsf
who / which / whereis • who mostra gli user loggati sulla macchina. • In VMS: show user • Esempio: • > who • root ttyp1 Nov 1 17:39 (:0.0) • leonardi ttyp6 Nov 1 17:53 (echosl) • which mostra dove si trova un comando. • Esempio: • > which gnuchess • /usr/bin/gnuchess • whereis mostra anche la posizione del file man corrispondente. • Esempio: • > whereis ls • ls: /bin/ls /usr/man/man1/ls.1
uname • 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: • ender:leonardi> uname • Linux • ender:leonardi> uname -snrm • Linux ender 2.0.34 i586 • ender:leonardi> uname -a • Linux ender 2.0.34 i586 • uname è molto utile negli script!
ps / 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). • > ps -ef • UID PID PPID STIME TTY S TIME COMM • root 7400 7389 16:07:25 ttyp5 S 0:00.32 tcsh • … • kill manda un segnale ad un processo. • Default: manda al processo il segnale TERM(inate) invitandolo a terminare. • > kill 7400(invita 7400 a terminare) • Se il processo 7400 è ancora presente provare con: • > kill -9 7400(uccidi 7400)
Variabili 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 dell’account in uso • HOSTNAME nome dell’host 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
printenv / setenv • printenv mostra una o più delle variabili di ambiente definite nel processo corrente. • Di default mostra la lista completa delle variabili. • > printenv TERM • xterm • Per cambiare il valore di una variabile di ambiente il comando cambia a seconda della shell usata. • Per csh, tcsh: • > setenv DISPLAY myxterm:0 • Per sh, bash, ksh, zsh: • > DISPLAY=myxterm:0 • > export DISPLAY • N.B. tutte le variabili di ambiente di un processo vengono ereditate dai processi che esso genera.
alias • Un alias è un nuovo comando definito in funzione dei comandi di sistema. • Viene creato con: • > alias ll=’ls -l’sh, bash, ksh, zsh • > alias ll ’ls -l’csh, tcsh • Una volta creato, un alias può essere utilizzato come qualsiasi altro comando di sistema. • > 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. • > unalias ll
Ridirezione dell’I/O • Di default l’input e l’output di un comando sono collegati al terminale su cui gira la shell. • > myMC.exe • How many events ? 100 • 100 events produced. End • > • Tutte le shell permettono però di ridirigere l’I/O su un file usando > per l’output e < per l’input. • > echo 100 > events.dat • > myMC.exe < events.dat > myMC.log • > cat myMC.log • How many events ? • 100 events produced. End • > • L’I/O può anche essere ridiretto su una pipe. • > echo 100 | myMC.exe > myMC.log
Controllo 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 l’esempio).
Controllo dei processi: esempio • > myMC.exe <events.dat >myMC.log & • [1] 1834 • > • (grazie al & alla fine il comando viene eseguito in background. Il prompt ricompare immediatamente) • > jobs • [1] Running myMC.exe <events.dat >myMC.log • > • (il comando jobs mostra che il processo sta effettivamente girando in background) • > fg 1 • myMC.exe <events.dat >myMC.log • (con fg il job viene riportato in foreground. Il prompt ricomparirà solo alla fine dell’esecuzione del comando) • ^Z • Suspended • > bg • [1] myMC.exe <events.dat >myMC.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)
Script 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
Esempio: .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” • breaksw • endsw
Esempio: .cshrc • # Esempio di file .cshrc • # Configura il comportamento della shell • set history=20 • set savehist=20 • set prompt=”Emanuele>” • # 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 \ • /afs/infn.it/roma1/project/babar/babar.sh • breaksw • endsw
Shell 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-incommand (if,foreach,echo), altri sono eseguibili esterni (mv) • i built-incommand 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
Shell 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: > myscript start let’s do it. > myscript stop stop it! > myscript pippo bad syntax!!
find 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 nomesimula.dat. > find . -name simula.dat -print ./montecarlo/data/simula.dat ./olddata/simula.dat Cerca nell’albero di directory /usr tutti i file con estensione .dat. > find /usr -name \*.dat -print /usr/games/doom.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.
Shell 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 • BINLIST=`find $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: • > cd somewhere • > 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