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.