Shell in UNIX: uso e vantaggi

Transcript

Shell in UNIX: uso e vantaggi
Shell in UNIX:
uso e vantaggi
Linux Day 2010
Università degli Studi di Salerno – 22 ottobre 2010
Daniele Costarella
Ivan Grimaldi
This material was released under Creative Commons License. You are free to copy, distribute, display and
perform the work, to make derivative woeks, to make commercial use of the work under the “Attribution” and
“Share Alike” consditions. You must give the original author credit as well as, if you build upon this work you
may distribute the resulting work only under a license identical to this one.
Agenda
• La Shell




Cos'è la Shell
Vantaggi
Tipi di Shell
Quale usare
• Bash




Cos'è la Bash
Comandi Built-in
Pipeline, Redirezione dell'I/O, Variabili
Esempi
• Scripting
 Parametri, Strutture Condizionali, Cicli, Funzioni
• Esempi di Applicazioni
2/54
La shell
Cos'è la shell
In un sistema operativo, una shell (o terminale) è un programma che permette agli utenti di
comunicare con il sistema e di avviare altri programmi. È una delle componenti principali di un
sistema operativo, insieme al kernel.
La shell è l'ambiente di lavoro attraverso cui è possibile eseguire programmi mediante
comandi.
4/54
Vantaggi della Shell
• Automatizzare i compiti amministrativi
• Eseguire operazioni complesse in maniera effi ciente
• Eseguire compiti ripetitivi
• Massimizzare la potenza della linea di comando
• Gestire il sistema nello startup e nello shutdown
• Script portabili su differenti sistemi UNIX
• Possibilità di creare propri comandi personalizzati
• Consentire agli utenti di modifi care il loro ambiente
…
• Risparmiare tanto tanto tempo! :)
5/54
Tipi di shell UNIX
Esistono varie shell sui sistemi UNIX:
• sh: Bourne Shell
• bash: Bourse Again Shell
• csh: C Shell
• tcsh: Tenex C Shell
• ksh: korn Shell
6/54
Bourne Shell
La Bourne shell, nota anche col nome di sh, è stata la shell testuale predefi nita di UNIX fi no
alla metà degli anni 90 per cedere poi il posto alla ksh.
Pur essendo concepita come interprete di un linguaggio di scripting, essa divenne popolare
anche nell'uso interattivo. Essa prende il nome dal suo inventore, Stephen Bourne dei
laboratori AT&T, che la sviluppò nel corso degli anni 1970, per rilasciarne nel 1978 la versione
poi usata nella versione 7 di UNIX.
7/54
Bourne Again Shell
Bash è una shell testuale del progetto GNU usata nei sistemi operativi UNIX e UNIX-like,
specialmente in GNU/Linux e Mac OS X.
Tecnicamente bash è un clone evoluto della shell standard di UNIX (/bin/sh).
Ne parleremo in maniera più approfondita più avanti...
8/54
C Shell
La C shell (csh) è un tipo di shell usato nei sistemi UNIX, sviluppato da Bill Joy per il sistema
BSD.
La shell C deriva originariamente dalla sesta versione di sh, la madre della Bourne shell; la
sua sintassi è però modellata su quella del linguaggio di programmazione C.
La shell C ha aggiunto molti miglioramenti ai suoi predecessori, come l'uso degli alias e una
storia dei comandi. Al giorno d'oggi le shell C non sono molto di moda; sono state superate da
shell come la Tenex C shell (tcsh), le Korn shell (ksh) e la Bourne Again Shell (bash).
9/54
Korn Shell
La Korn shell (ksh) è una shell UNIX sviluppata da David Korn dei laboratori Brut AT&T
intorno alla metà degli anni ottanta.
Le Korn shell sono compatibili con le Bourne shell e includono parecchie caratteristiche delle
C shell, come ad esempio la storia dei comandi, ispirata dalle richieste degli utenti dei
laboratori Brut.
Le ksh mirano a rispettare il linguaggio standard per shell (Shell Language Standard). Fino al
2000 le Korn Shell sono rimaste software proprietario di AT&T per poi divenire open source,
come parte della Open Source Software Collection di AT&T, sotto la Common Public License.
10/54
Tenex C Shell
La TENEX C Shell, o tcsh (pronunciato "T-shell") è una shell per sistemi UNIX-like basata e
compatibile con C shell (csh). Essenzialmente è una C shell che offre alcune caratteristiche
aggiuntive come il completamento dei nomi dei fi le, command-line editing e altre funzionalità
aggiuntive. La "T" all'interno del nome sta per TENEX, un sistema operativo che ha ispirato
Ken Greer, l'autore di tcsh. Le versioni iniziali di Mac OS X proponevano come shell
predefi nita proprio tcsh ma in seguito la scelta degli sviluppatori di casa Apple è ricaduta su
bash proponendola come shell di default a discapito di tcsh.
11/54
Quale usare?
Noi utilizzeremo la bash poiché è la più diffusa e completa sebbene la maggior parte delle
nozioni trattate si potranno usare anche su altri tipi di shell.
Si trova sulla maggior parte dei sistemi UNIX moderni (volendo si può installare anche su
Windows) e fa parte del progetto GNU.
12/54
Bash
Cos'è la bash?
Si tratta di un interprete di comandi che permette all'utente di comunicare col sistema
operativo attraverso una serie di funzioni predefi nite, o di eseguire programmi. bash è in
grado di eseguire i comandi che le vengono passati, utilizzando la redirezione dell'input e
dell'output per eseguire più programmi in cascata in una pipeline software, passando l'output
del comando precedente come input del comando successivo.
Oltre a questo, bash mette a disposizione un semplice linguaggio di scripting che permette di
svolgere compiti più complessi, non solo raccogliendo in uno script una serie di comandi ma
anche utilizzando variabili, funzioni e strutture di controllo del fl usso.
14/54
Bash
15/54
La shell
• Il carattere $ che precede il cursore viene defi nito prompt della Shell e indica che il sistema
è pronto è sta aspettando l'input.
• Una ~ denota la directory home dell'utente che ha effettuato l'accesso
• Se al posto di $ il prompt della shell presenta il simbolo # signifi ca che l'accesso è stato
eseguito con l'account root, account che gode del controllo completo sul sistema.
16/54
Cerchi aiuto?
I comandi UNIX sono tanti e le opzioni sono centinaia; generalmente ogni comando è capace
di fornire una breve descrizione delle sue funzionalità e delle sue principali opzioni, mediante
l'opzione -h oppure --help.
Esempio:
# man ls
Visualizza la pagina del manuale in linea relativa al comando ls
17/54
Comandi built-in
La shell ha alcuni comandi built-in, chiamati anche comandi nativi. Questi comandi sono
eseguiti direttamente dalla shell e non chiamano nessun altro programma per essere eseguiti.
Questi comandi built-in possono essere diversi tra le varie shell.
Alcuni dei comandi built-in più comunemente usati sono:
• echo: scrive una stringa su standard Output
• cd: cambia la directory di lavoro
• pwd: mostra la directory di lavoro corrente
• read: legge una linea di input da standard Input
• if: condizionale if
• for: condizionale di ciclo for
.......
18/54
Pipeline
La pipeline è una sequenza di semplici comandi separati dal seguente operatore '|' ed è uno
strumento fondamentale per l'utilizzo della shell.
L'output di ogni comando è preso come input del successivo comando; dunque, ogni
comando legge l'output del precedente.
Esempio:
$ ls -l /usr/bin | more
$ echo “/home/hcsslug/LinuxDay_2010.odp” | sed -e “s/.*\///”
19/54
Redirezione dell'I/O
Esistono 3 fl ussi di dati:
• Standard Input: in genere corrisponde alla tastiera
• Standard Output: in genere corrisponde al monitor
• Standard Error: in cui emette gli eventuali messaggi di error
È possibile redirezionare tali fl ussi su altri fi le
• >: redireziona l'output su un fi le
• >>: redireziona l'output su un fi le, modalità append
• <: prende l'input da un fi le
• 2>: redireziona lo standard error su un fi le
20/54
Redirezione dell'I/O
Esempi:
# ls > listato.txt
# cat listato.txt
# echo “Ciao” >>
listato.txt
# cat < listato.txt
# man comandoerrato 2> /dev/null
21/54
Variabili
Come in qualsiasi linguaggio di programmazione è possibile fare uso di variabili. Una
variabile in bash può contenere un numero, un carattere o una stringa di caratteri.
Le variabili possono non essere defi nite.
Esempi:
# STR = “Hello HCSSLUG”
# echo $STR
22/54
Lavorare con i file: esempi
• Dati i seguenti File mon.logins e tues.logins
mon.logins
Ageorge
Cbetts
Jchen
jdoe
Jmarsch
lkeres
Proy
Sphillip
wyepp
tues.logins
ageorge
bsmith
cbetts
jchen
jmarsch
lkeres
mschmidt
sphillip
wyepp
$ cmp mon.logins tues.logins
mon.logins tues.logins differ: char 9, line 2
23/54
Lavorare con i file: esempi
• Dati i seguenti File mon.logins e tues.logins
mon.logins
Ageorge
Cbetts
Jchen
jdoe
Jmarsch
lkeres
Proy
Sphillip
wyepp
tues.logins
ageorge
bsmith
cbetts
jchen
jmarsch
lkeres
mschmidt
sphillip
wyepp
$ diff mon.logins tues.logins
2d1
< bsmith
4a4
> jdoe
7c7
< mschmidt
--> proy
24/54
Lavorare con i file: esempi
• Dato il fi le users
Users
linux
blackbliss
diablo
tuco
pred
$ sort -k 3
blackbliss
diablo
tuco
pred
linux
Linus Torvalds
Daniele Costarella
Carmine De Rosa
Ivan Grimaldi
Paolo Rossi
users
Daniele Costarella
Carmine De Rosa
Ivan Grimaldi
Paolo Rossi
Linus Torvalds
4/15/2010
3/12/2010
1/5/2010
4/17/2010
4/2/2010
3/12/2010
1/5/2010
4/17/2010
4/2/2010
4/15/2010
Oppure in ordine inverso:
$ sort -r users
tuco
Ivan Grimaldi
pred
Paolo Rossi
linux
Linus Torvalds
blackbliss Daniele Costarella
diablo
Carmine De Rosa
4/17/2010
4/2/2010
4/15/2010
3/12/2010
1/5/2010
25/54
Scripting
Script di shell
• Si possono scrivere programmi di shell creando script contenenti alcuni comandi
• Convenzionalmente ogni script dovrebbe iniziare con una prima riga del tipo #!/bin/bash,
dove viene indicato l'interprete necessario ad eseguire lo script; se si omette l'intestazione i
risultati non sono garantiti
• Il carattere # ha la funzione di iniziare un commento: tutto ciò che segue fi no alla fi ne della
riga viene ignorato dall'interprete.
hello.sh
#!/bin/bash
#Questo è il commento
echo “Hello Word”
exit 0
27/54
I parametri
Quando si invoca uno script è possibile specifi care alcuni parametri di esecuzione; tali
parametri possono essere recuperati attraverso alcune variabili speciali:
• $0: il nome dello script che è stato invocato
• $1,...,$9: $i corrisponde all'i-esimo parametro passato
• $*: corrisponde all'espasione $1 $2 $3 etc.
• $@: corrisponde “$1” “$2” “$3” etc.
• $#: numero parametri distinti passati
Se si utilizzano più di 9 parametri si utilizza il comando shift per accedere ai successivi
28/54
Strutture condizionali
L'espressione condizionale if è uno dei costrutti fondamentali, la sintassi è la seguente.
if [ condizione1 ]
then
if [ condizione2 ]
then
fa-qualcosa # Ma solo se sia "condizione1" che "condizione2"
sono vere.
fi
fi
29/54
Strutture condizionali: esempio
Esempio 1:
#!/bin/bash
# controlla che almeno un parametro sia stato passato e
# che sia uguale al nome dell’utente corrente
if [ -z "$1" ];
then
echo "utilizzo: ‘basename $0‘ nome" exit 1
fi
CURRENT_USER=‘whoami ‘
if [ "$CURRENT_USER" = "$1" ];
then
echo "Il parametro passato `e uguale all’utente corrente."
else
echo "Il parametro non corrisponde all’utente corrente." exit 1
fi
exit 0
30/54
Strutture condizionali: esempio
Esempio 2: MENU (if/else annidati)
#!/bin/bash
# Declare variable choice and assign value 4
choice=4
# Print to stdout
echo "1. Bash"
echo "2. Scripting"
echo "3. Tutorial"
echo -n "Please choose a word [1,2 or 3]? "
# Loop while the variable choice is equal 4
# bash while loop
while [ $choice -eq 4 ]; do
# read user input
read choice
# bash nested if/else
if [ $choice -eq 1 ] ; then
echo "You have chosen word: Bash"
31/54
Strutture condizionali: esempio
Esempio 2 (continua)
elif [ $choice -eq 2 ] ; then
echo "You have chosen word: Scripting"
elif [ $choice -eq 3 ] ; then
echo "You have chosen word: Tutorial"
else
echo "Please make a choice between 1-3 !"
echo "1. Bash"
echo "2. Scripting"
echo "3. Tutorial"
echo -n "Please choose a word [1,2 or 3]? "
choice=4
fi
done
32/54
Test sui file
• -d $var - fi le is a directory
• -e $var - fi le exists
• -f $var - fi le is a fi le (i.e., not a directory)
• -L $var - fi le is a symbolic link
• -p $var - fi le is a named pipe
• -S $var - fi le is a socket
• -o $var - fi le is owned by the user
• -r $var - user has read access
• -w $var - user has write access
• -x $var - user has execute access
• -z $var - fi le is zero-length
Tutti ritornano True se corretti
33/54
Esempio: ricerca
Esempio
#! /bin/sh
f=$1
#first parameter passed to the script
for d in *
do
if [ -e $f ]; then
echo "Esiste"
exit 0
fi
done
echo "Non trovato"
34/54
Ciclo while
La sintassi del while è la seguente
while condizione
do
lista di comandi
[break]
[continue]
Done
exit
35/54
Ciclo while
Esempio:
#!/bin/bash
# fa un conto alla rovescia partendo da un numero passato
# da tastiera fino a zero. Se non specificato, il conteggio parte da 10
if [ ! -z "$1" ]; then
COUNT="$1"
else COUNT=10
fi
echo "Inizio conto alla rovescia:"
while [ "$COUNT" -ge 0 ];
do
sleep 1
echo "$COUNT"
let "COUNT = $COUNT - 1"
done
echo "Fine conteggio"
exit
36/54
Ciclo For
Per effettuare un ciclo tra una lista di valori di tipo stringa si può usare lo statement for.
for variabile [in lista_di_valori]
do
lista di comandi
Done
Esempio:
#!/bin/sh
for file in *.old
do
newf=`basename $file .old`
cp $file $newf.new
done
37/54
Funzioni
Esempio:
!/bin/bash
# BASH FUNCTIONS CAN BE DECLARED IN ANY ORDER
function function_B {
echo Function B.
}
function function_A {
echo $1
}
function function_D {
echo Function D.
}
function function_C {
echo $1
}
# FUNCTION CALLS
# Pass parameter to function A
function_A "Function A."
function_B
# Pass parameter to function C
function_C "Function C."
function_D
38/54
Bash Select
Esempio:
#!/bin/bash
PS3='Choose one word: '
# bash select
select word in "linux" "bash" "scripting" "tutorial"
do
echo "The word you have selected is: $word"
# Break, otherwise endless loop
break
done
exit 0
39/54
Bash Trap Command
Esempio:
#!/bin/bash
# bash trap command
trap bashtrap INT
# bash clear screen command
clear;
# bash trap function is executed when CTRL-C is pressed:
# bash prints message => Executing bash trap subrutine !
bashtrap()
{
echo "CTRL+C Detected !...executing bash trap !"
}
# for loop from 1/10 to 10/10
for a in `seq 1 10`; do
echo "$a/10 to Exit."
sleep 1;
done
echo "Exit Bash Trap Example!!!"
*per la guida al comando seq digita “man seq”
40/54
Esempi di
Applicazioni
Esempi di Applicazioni
• Un semplice script che esegue il backup da shell
Esempio 1:
#!/bin/bash
tar -czf myhome.tar.gz /home/hcsslug
42/54
Esempi di Applicazioni
• Un semplice script che esegue il backup da shell (leggermente migliorato)
Esempio 1:
#!/bin/bash
OF=/var/my-backup-$(date +%Y%m%d).tgz
tar -cZf $OF /home/hcsslug/
43/54
Esempi di Applicazioni
• Altro script per il backup delle route tramite ssh
Esempio:
#!/bin/bash
TODAY=`date +%Y-%m-%d`
[email protected]
ssh $ACCOUNT show ip route > route.$TODAY
bzip2 *.$TODAY
44/54
Esempi di Applicazioni
• Esempio di script di backup di fi le su FTP:
Esempio 1:
#!/bin/sh
HOST=$1
USERNAME=$2
PASS=$3
FILE=$4
ftp -in <<EOF
open $HOST
user $USERNAME $PASS
bin
hash
prompt
dele $FILE
put $FILE
bye
EOF
echo "$FILE backed up successfully" | mail -s "backup”” "$USERNAME@$HOST"
45/54
Esempi di Applicazioni
• Backup di database mySQL:
Esempio 1:
#/bin/bash
HOST=$1; USER=$2; PASS=$3
FILENAME=`date +%Y%m%d-%H%M`
DIRNAME=/home/vijay/mysqldumpdir/
cd $DIRNAME
mysqldump -h$HOST -u$USER -p$PASS --all-databases > $FILENAME
bzip2 $FILENAME
46/54
Esempi di Applicazioni
• Automatizzare un “build process”
Decompressione all'interno di una directory temporanea:
$ mkdir work
$ cd work
$ tar xzf /usr/src/distfiles/sed-3.02.tar.gz
Configurazione e compilazione:
$ cd sed-3.02
$ ./configure --prefix=/usr
(autoconf generates appropriate makefiles, this can take a while)
$ make
* il pacchetto è compilato da sorgenti per cui il processo potrebbe impiegare del tempo
47/54
Bash Trap Command
• Un semplice script che esegua i precedenti passi potrebbe essere il seguente:
Esempio:
#!/usr/bin/env bash
if [ -d work ]
then
# remove old work directory if it exists
rm -rf work
fi
mkdir work
cd work
tar xzf /usr/src/distfiles/sed-3.02.tar.gz
cd sed-3.02
./configure --prefix=/usr
make
48/54
Esempi di Applicazioni
• Un po' più generale?
Esempio:
#!/usr/bin/env bash
# P is the package name
P=sed-3.02
# A is the archive name
A=${P}.tar.gz
export ORIGDIR=`pwd`
export WORKDIR=${ORIGDIR}/work
export SRCDIR=${WORKDIR}/${P}
if [ -z "$DISTDIR" ]
then
# set DISTDIR to /usr/src/distfiles if not already set
DISTDIR=/usr/src/distfiles
fi
export DISTDIR
49/54
Esempi di Applicazioni
• Un po' più generale?
Esempio 1: continua
if [ -d ${WORKDIR} ]
then
# remove old work directory if it exists
rm -rf ${WORKDIR}
fi
mkdir ${WORKDIR}
cd ${WORKDIR}
tar xzf ${DISTDIR}/${A}
cd ${SRCDIR}
./configure --prefix=/usr
make
50/54
Esempi di Applicazioni
• Un altro esempio
Esempio:
#! /bin/bash
PATH=$1/*
if [ $# -eq 0 ]; then
echo "Usage: $0 [directory] [format]"
echo "FORMATO:"
echo "1: PNG"
echo "2: TIFF"
echo "3. BMP"
exit 1
fi
if [ -d $1 ]; then
cd $1
for file in *; do
echo "convert $file $file.$2"
done
kdialog --passivepopup 'Conversione terminata!' 3
#notify-send -t 3000 "notification title" "notification text"
fi
51/54
Crontab
• Crontab è un fi le che contiene le istruzioni del demone cron in modo tale da “eseguire un
determinato comando a una data ora e data”.
• Ogni utente ha un proprio fi le crontab che contiene i comandi che verranno eseguiti con i
privilegi dell'utente stesso.
• I campi per l'ora e data sono:
Campo
valori consentiti
Minuto
Ora
giorno del mese
mese
giorno della settimana
0-59
0-23
1-31
1.12 (o nomi)
0-7 (o nomi)
52/54
Crontab
• Un esempio
Esempio:
$ crontab -e
# Minute
# (0-59)
0
Hour
(0-23)
2
Day of Month
Month
(1-31)
(1-12 or Jan-Dec)
12
*
Day of Week
(0-6 or Sun-Sat)
0,6
Command
/usr/bin/backup
53/54
GRAZIE per l'attenzione
Daniele Costarella <[email protected]>
Ivan Grimaldi <[email protected]>
This material was released under Creative Commons License. You are free to copy, distribute, display and
perform the work, to make derivative woeks, to make commercial use of the work under the “Attribution” and
“Share Alike” consditions. You must give the original author credit as well as, if you build upon this work you
may distribute the resulting work only under a license identical to this one.