Il sistema operativo UNIX La shell Niccolò Battezzati <[email protected]> Politecnico di Torino Dip. Automatica e Informatica Sistemi Operativi - Introduzione 1 Organizzazione SISTEMI OPERATIVI Docente: Prof. Pietro Laface ([email protected]) Esercitatore: Ing. Niccolò Battezzati ([email protected]) Esercitazioni in aula – GIO 12:30 – 14:30 (AULA 14) Sistemi Operativi - Introduzione Laboratorio – MER 08:30 – 10:30 (A-L) – MER 10:30 – 12:30 (M-Z) 2 Programma • Linux: introduzione e comandi principali • Shell: l’interprete dei comandi • Linux: dettagli e comandi avanzati • Shell: uso avanzato e script • vi(m): un editor di testo Sistemi Operativi - Introduzione 3 Indice • Introduzione • Caratteristiche • Espansione dei comandi • Scripting di base Sistemi Operativi - Introduzione 5 Indice • Introduzione • Caratteristiche • Espansione dei comandi • Introduzione agli script Sistemi Operativi - Introduzione 6 Programs Shell Unix kernel Introduzione HW • E’ lo strato più esterno del S.O. e fornisce un’interfaccia utente – era l’unica interfaccia prima dell’introduzione del server X • In Unix la shell non è parte del kernel – è un normale processo utente Sistemi Operativi - Introduzione 7 Introduzione • Una shell può essere attivata: – automaticamente al login – in modo annidato dentro un'altra shell • Per terminare una shell: – exit – il carattere di EOF (tipicamente ^d) Sistemi Operativi - Introduzione 8 Introduzione • In Unix sono disponibili molte shell: – Bourne shell (sh): la shell originaria, molto usata nella programmazione sistemistica – C-shell (csh): la shell di Berkeley, ottima per l'uso interattivo e per gli script non di sistema – Korn shell (ksh): la Bourne shell riscritta dall'AT&T per assomigliare di più alla C-shell – Tahoe C-shell (tcsh): dal progetto Tahoe, una C-shell migliorata – Bourne again shell (bash) Sistemi Operativi - Introduzione 9 Introduzione • All’avviamento ogni shell esegue i comandi elencati nei propri file di inizializzazione: – /etc/profile: comandi globali – ~/.profile: comandi per il singolo utente • alcune shell usano anche il file .logout per eseguire comandi quando vengono terminate. Sistemi Operativi - Introduzione 10 Introduzione • Per la shell bash, i file di inizializzazione sono: – /etc/profile: comandi per tutti gli utenti – ~/.bash_profile opp. ~/.profile: comandi propri dell’utente – ~/.bashrc: comandi propri dell’utente eseguiti in una shell non di login. Sistemi Operativi - Introduzione 11 Indice • Introduzione • Caratteristiche • Espansione dei comandi • Introduzione agli script Sistemi Operativi - Introduzione 12 Caratteristiche e uso della shell BASH • • • • • • • Parametri Completamento Pipeline Redirezione dell'I/O History Aliasing Gestione dei processi Sistemi Operativi - Introduzione 13 Parametri • I parametri sono delle entita` che memorizzano un valore (indicato con $parametro): – parametri posizionali: 0, 1, 2, 3... Sono usati per indicare i parametri passati a un comando o a una funzione; – parametri speciali: – *: la lista dei parametri posizionali – #: il numero di parametri posizionali – ?: il valore di ritorno dell’ultimo comando – variabili: contengono un valore non tipizzato. Sistemi Operativi - Introduzione 14 Variabili • Una variabile ha un nome e un valore, che viene assegnato come segue: • nome=“valore” (usare echo $nome per visualizzarlo) • Il comando export variabile permette di renderla visibile ad altri processi • Il comando unset variabile ne cancella il valore • Built-in variables, tra cui: • PATH • HOME • BASH_ARGV, BASH_ARGC • Array unidimensioanli: • nome[indice]=“valore” (usare echo Sistemi Operativi - Introduzione ${nome[indice]}) 15 Completamento • Espansione dei nomi di file con il carattere TAB – se la stringa comincia con $ la shell cerca di completare col nome di una variabile – altrimenti, la shell cerca di completare col nome di un comando – altrimenti, la shell cerca di completare con nomi di file ordinari nella directory corrente. Sistemi Operativi - Introduzione 16 Pipeline stdin proc stdout stderr stdin proc stdout stderr • Il collegamento stdout-stdin si chiama pipe e crea in memoria un canale diretto tra i due processi Sistemi Operativi - Introduzione 17 Pipeline • comando1 | comando2 – pipe tra i due comandi Esempi: – – – – ls -la | more ls –l | grep “main.c” cat main.h | sed ‘s/N 10/N 12/g’ cat main.c | awk –f my_script.awk Sistemi Operativi - Introduzione 18 Redirezione dell’I/O • • • • comando < file: comando > file: comando >> file: comando << FINE: text FINE • comando &> file: • comando 2> file: stdin da file stdout in file (cancellato se esiste) stdout accodato a file stdin da “here document” (bash) stderr+stdout in file (bash) stderr in file (1 è stdout) /dev/null e` un file speciale su cui si puo` scrivere senza accumulare byte su disco Sistemi Operativi - Introduzione 19 History : mostra i comandi eseguiti precedentemente !n: esegue il comando numero n nel buffer !-n: esegue l'n-ultimo comando !$: l'ultimo parametro del comando precedente !*: tutti i parametri del comando precedente !stringa: l'ultimo comando che inizia con stringa !!:s/vecchio/nuovo: rimpiazza la prima occorrenza di vecchio nell'ultimo comando con nuovo • CTRL-r com: filtra la history mostrando solo i comandi che contengono la stringa com. • • • • • • • Sistemi Operativi - Introduzione 20 Aliasing • E’ possibile definire dei comandi con nuovi nomi (alias) • Gli alias sono locali alla shell corrente • alias: • alias nome=“valore”: • unalias nome: elenca gli alias definiti definisce un alias cancella un alias Esempi: alias ll=“ls -al” alias vi=“vim” Sistemi Operativi - Introduzione 21 Gestione dei processi Esecuzione batch: i processi vengono eseguiti in modo sequenziale. comando1 Last-login: … > … > comando1 output comando1 comando2 Sistemi Operativi - Introduzione > comando2 output comando2 22 Gestione dei processi Esecuzione concorrente: i processi vengono eseguiti in modo “concorrente”. Last-login: … > … comando1 comando2 Sistemi Operativi - Introduzione > comando1 & output comando1 > comando2 output comando1 output comando2 23 Gestione dei processi I processi si possono interrompere con il comando CTRL-z e ripristinare con il comando fg. Last-login: … > … comando1 CTRL-z fg Sistemi Operativi - Introduzione > comando1 output comando1 CTRL-z > fg %1 output comando1 24 Stato dei processi comando Shell Run fg comando & fg fg CTRL-Z Stopped Sistemi Operativi - Introduzione bg Run bg 25 Gestione dei processi - comandi • jobs • bg %job-id • fg %job-id • kill -9 pid • killall -9 name • ps Esempi: ps –e ps –f ps –u root Sistemi Operativi - Introduzione elenca i job porta il job in background porta il job in foreground termina il processo termina tutti i processi name elenca i processi con i relativi dettagli 26 Indice • Introduzione • Caratteristiche • Espansione dei comandi • Introduzione agli script Sistemi Operativi - Introduzione 27 Quoting • Serve per dire alla shell di non interpretare alcuni caratteri speciali. Ci sono tre metodi: – \ preserva il valore letterale del carattere che segue; – ‘’ preservano il valore letterale del loro contenuto. Non possono essere innestati; – “” preservano il valore letterale del contenuto tranne dei simboli $, ‘, \. Possono essere innestate. Sistemi Operativi - Introduzione 28 Interpretazione • Dopo aver suddiviso la linea di comando in parole, la shell applica diversi tipi di sostituzione (in ordine!): – preamble{e1, e2, ...}: sostituito con “preamblee1 preamblee2 ...” – ~: sostituitoin $HOME – $param: sostituito col valore del parametro (se il parametro e` complesso meglio usare ${param}) – `comando`: sostituito con lo standard output di comando – $((espressione)): sostituito col risultato dell’espressione aritmetica – parole contenenti *, ? e [ sono sostituite con il valore dell’espressione regolare. Sistemi Operativi - Introduzione 29 Regexp • La shell espande le espressioni regolari secondo le sguenti regole: –* una qualsiasi stringa –? un qualsiasi carattere singolo – [...] uno qualsiasi dei caratteri in parentesi Sistemi Operativi - Introduzione 30 Esempio • Come vengono espansi i seguenti comandi? – so_es1=“~/so_es1” – backup_dir=“backup_`date`” – mkdir $so_es1/”$backup_dir” – cp –r $so_es1/*.{c,h} $so_es1/”$backup_dir” Sistemi Operativi - Introduzione 31 Indice • Introduzione • Caratteristiche • Espansione dei comandi • Introduzione agli script Sistemi Operativi - Introduzione 32 Script - introduzione • E’ possibile memorizzare in un file una serie di comandi, eseguibili richiamando il file stesso • Esecuzione indiretta: – source scriptname args • Esecuzione diretta eseguendo lo script – ./scriptname args – è necessario che il file abbia il permesso di esecuzione – la prima riga del file inizia con #! seguita dal nome (con il path assoluto) della shell con cui si devono eseguire i comandi Sistemi Operativi - Introduzione 33 Script - introduzione #!/bin/bash so_es1=“~/so_es1” backup_dir=“backup_`date`” mkdir $so_es1/”$backup_dir” cp –r $so_es1/*.{c,h} $so_es1/”$backup_dir” Sistemi Operativi - Introduzione 34