Sistemi Operativi – La shell Salvatore Campagna Email:...
-
Upload
geltrude-costa -
Category
Documents
-
view
220 -
download
0
Transcript of Sistemi Operativi – La shell Salvatore Campagna Email:...
Sistemi Operativi – La shell
Salvatore CampagnaEmail: [email protected] di TorinoDipartimento di Automatica e Informatica
La shell - InstroduzioneLo strato più esterno del Sistema
OperativoIn UNIX/Linux la shell non è parte
del sistema operativo ma è un normale processo utente
Utilizzata per impartire comandi
La shell - IntroduzioneIn UNIX esistono diverse shell
◦Bourne Shell (sh)◦C-shell (csh)◦Korn shell (ksh)◦Tahoe C-shell (tcsh)◦Bourne Again Shell (bash)
La shell - InstroduzioneAll’avvio della shell vengono
eseguiti i comandi contenuti in due file:
1. /etc/profile: per i comandi globali
2. ~/.profile: comandi per il singolo utente
Alcune eseguono anche i comani contenuti nel file .logout quando terminano
Avvio shell BashPer la shell Bash i file sono:
◦Shell di login: /etc/profile e poi dalla propria home .bash_profile, .bash_login, .profile (di questi ultimi tre verrà letto solo il primo file esistente)
◦Shell di login: .bash_logout, questo file viene letto all'uscita dalla shell
◦Interattiva: .bashrc
Caratteristiche della shellParametriCompletamento automaticoPipe (o Pipeline)Redirezione dell’I/OHistoryAliasingEspansione dei comandi
La shell – I parametriSimili a variabili di un linguaggio
di programmazioneMemorizzano uno o più valoriNon hanno un tipoPossono avere un nome ($n,
$nome, $address,…)Posizionali ($1, $2, …) se si
riferiscono a parametri passati a un programma sulla riga di comando
La shell – Parametri speciali$0: nome del comando in esecuzione$#: numero di parametri posizionali sulla
riga di comando$?: exit stats dell’ultimo comando$$: process ID della shell corrente$!: process ID dell’ultimo comando
eseguito in background$-: opzioni passate alla shell corrente$*: una stringa contenente tutti i
parametri posizionali ($1, $2, …)$@: come $*
La shell – Le variabiliAssegnazione: nome=“Alice”,
max=“10”ATTENZIONE: non inserire spazi
tra “=“ e ‘”’export nome: rende la variabile
nome visibile ad altri processiunset nome: cancella la variabile
e il suo valore
La shell – Le variabiliVariabili built-in:
◦PATH: variabile che indica le directory in cui cercare i comandi
◦HOME: variabile che punta alla home directory dell’utente
◦BASH_ARGV, BASH_ARGC: parametri e numero di parametri passati alla shell
Vettori◦vett[1]=‘’uno’’, vett[2]=‘’due’’◦v=(uno due tre quattro)
La shell – visualizzazione di variabiliSi deve precedere il nome della
variabile con il simbolo ‘$’Esempi:
◦echo $nome visualizza il contenuto della variabile nome
◦echo ${vett[2]} visualizza il contenuto dell’elemento con indice ‘2’ del vettore vett
La shell – Completamento automaticoIl tasto TAB permette di espandere
e completare nomi di file, variabili e comandi:◦Se la riga comincia con $ la shell cerca
di completare con un nome di variabile◦Altrimenti cerca di completare la riga
con un comando◦In fine cerca di completare con il nome
di un file ordinario della directory corrente
La shell - PipeConcatenazione di più comandi in
modo tale che lo stdout di un processo diventi lo stdin di un altro processo
proc1proc1stdin(0) stdout(1)
stderr(2)
proc2proc2stdin stdout
stderr
La shell - PipeSintassi: comando1 | comando2L’output di comandi1 diventa
l’input di comando2Esempi:
◦ls –la | more◦cat /etc/passwd | sed ‘s/bash/csh/g’◦cat /etc/passwd | grep “alice”
La shell – Redirezione dell I/OE’possibile redirigere stdout,
stdin e stderr di un processo su file
comando < file: redirige lo stdin di comando in modo che l’input sia letto da file
comando > file: redirige lo stdout di comando in modo che scriva su file
Esempio: cat /etc/passwd | grep “alice” > alice_data.txt
La shell – Redirezione dell’I/Ocomando >> file: redirige lo stdout di
comando in modo che venga scritto su file in modalità append (non cancella i dati presenti)
comando << file: redirige lo stdin di comando in modo che venga letto da HERE DOCUMENT
Esempio:◦$ tr a-z A-Z <<END_TEXT ◦> one two three◦> uno dos tres◦> END_TEXT ◦ONE TWO THREE ◦UNO DOS TRES
La shell – Redirezione dell’I/Ocomando &> file: redirige stderr
e stdout di comando su filecomando 2> file: redirige stderr
su filecomando 1> file: redirige stdout
su file (come comando > file)comando 1> filea 2>fileb:
redirige stdout e stderr su file diversi
La shell redirezione dell’I/O/dev/null è un file virtuale con la
caratteristica di scartare (non memorizzare) tutti i dati che gli vengono scritti
comando > /dev/null: scrive scartando i dati di output
comando < /dev/null: legge un end-of-file EOF
comando 2> /dev/null: ignora i messaggi di errore
La history : mostra i comandi eseguiti
precedentementehistory: visualizza tutti I comandi
eseguiti su due colonne con <numero comando> <comando>
Si può fare riferimento a un comando contenuto nella history attraverso il suo numero
La history!n: esegue il comando n
◦Se n è negativo esegue l’n-ultimo comando
!<stringa>: esegue l’ultimo comando che comincia con <stringa>
!!:s/<old>/<new>: rimpiazza la prima occorrenza di <old> nell’ultimo comando con <new>
CTRL-r: entra in modalità di ricerca
AliasingE’ possibile definire nuovi nomi
da associare a un comandoIl nuovo nome è un aliasIl comando alias senza parametri
visualizza gli alias definiti per la shell corrente
alias <alias>= ‘’valore’’ definisce un nuovo alias
unalias <alias>: cancella l’alias con nome <alias>
AliasingEsempi:
◦alias ll = ‘’ls –l’’◦alias rm = ‘’rm –i’’◦alias cd.. = ‘’cd ..’’◦alias dir = ‘’ls –l’’◦alias vi=‘’vim’’
Sono validi nella shell correnteSe inseriti in
/home/<user>/.bashrc gli alias vengono definiti all’avvio della shell
Espansione dei comandiLa shell esegue una serie di
espansioni o sostituzioni in un comando
Esempio: ls $HOMELa shell espande (o sostituisce) la
variabile $HOME con il suo contenuto
Il comando eseguito diventa ls /home/alice
Espansione dei comandiIl quoting serve a evitare
l’espansioneCi sono tre modi per fare quoting
◦Usare il carattere ‘\’: preserva il valore letterale del carattere che segue
◦Gli apici singoli ‘ ‘: preservano il valore letterale del loro contenuto
◦Gli apici doppi: come precedenti ma escluso $, $() e \
Espansione dei comandiLa shell esegue l’espansione in un
ordine ben preciso dopo aver analizzato la riga di comando
Brace Expansion: viene sostituito prima il contenuto delle parentesi graffe (se non quotate)◦Esempio: cat file{1,2,3}.txt viene sostituito
da cat file1.txt file2.txt file3.txtTilde Expansion: viene espanso i
carattere tilde ~ (se non quotate)◦Esempio: cat ~/file.txt viene espanso in
cat /home/alice/file.txt
Espansione dei comandiParameter Expansion: si sostituisce il
parametro col suo valore◦Esempio: dir=‘’/tmp’’; find $dir –name
‘’*.c’’ viene espanso in find /tmp -name ‘’*.c’’
Command Expansion: si sostituisce con l’output del comando◦Esempio: cat $(find . –name ‘’*.c’’) viene
espanso in cat main.c file1.c file2.cSupponendo che la directory corrente contenga i file main.c file1.c e file2.c
Espansione dei comandiArithmetic Expansion: viene
espanso il risultato di una operazione aritmetica◦Esempio: echo $((2*3+1)) viene
espanso in echo 7Word Splitting: la riga di
comando viene suddivsa in parole
Espansione dei comandiFilename expansion: vengono sostituiti i
nomi di file in corrispondenza di espressioni contenenti *, ? E [...]◦Esempio: cat *.c viene espanso in cat main.c
file1.c file2.c (* = qualsiasi stringa)◦Esempio: cat file?.c viene espanso in cat
file1.c file2.c (? = qualsiasi carattere singolo)◦Esempio: cat file[ab].c espanso in cat filea.c
fileb.c ([ ] = qualsiasi carattere tra parentesi)Supponendo che la directory corrente contenga i file main.c file1.c e file2.c
Espansione dei comandiQuote Removal: tutte le occorrenze non
quotate dei caratteri \ ‘ e ‘’ vengono rimossi a meno che queste non siano il risultato di una espansione◦Esempio echo ‘Hello World’ espanso in echo
Hello World◦Esempio: var=‘ ’’hello’’ ‘ l’espansione di
echo $var da come risultato echo ‘’hello’’◦Gli apici doppi sono il risultato della
parameter expansion della variabile var e quindi non vengono rimossi quando viene eseguito il quote removal
EsempioCome vengono espansi i seguenti
comandi?◦so_es=‘’ ~/so_es ‘’◦backup_dir=‘’backup_$(date)’’◦mkdir -p $so_es/”$backup_dir”◦cp –r ~/so_es1/*.{c,h} ~/so_es1/”$backup_dir”