Previous Next Contents

5. Lavorare con la shell

5.1 Uso delle variabili

Abbiamo già visto come si possono ridefinire le variabili d'ambiente del sistema operativo. Ma queste non sono le uniche variabili messe a disposizione dell'OS.

In un qualsiasi momento è possibile definire, per scopi propri, una propria variabile.

Le variabili sono nomi composti di caratteri alfanumerici, generalmente esse nella loro interezza vengono indicate semplicemente dal loro nome, mentre il loro contenuto si indica con il nome preceduto dal carattere ``$''.

Ad esempio

QUESTAVARIABILE="proviamo se funziona"

Per vedere il contenuto della variabile QUESTAVARIABILE, possiamo utilizzare ad esempio il comando

echo

nella forma

echo $QUESTAVARIABILE

che ci dà come output

proviamo se funziona

Se avessimo scritto semplicemente

echo QUESTAVARIABILE

avremmo avuto come output semplicemente

QUESTAVARIABILE

perché non avremmo referenziato il contenuto della variabile in questione, ma semplicemente il suo nome.

Attenzione all'uso delle virgolette. Le virgolette infatti hanno per così dire una funzione di protezione degli argomenti.

Infatti la shell in mancanza delle virgolette interpreta una linea come un comando seguito da una serie di argomenti, ad esempio se noi utilizziamo la seguente forma

QUESTAVARIABILE=proviamo se funziona

avremmo un output del tipo:

bash: se: command not found

proprio perché il se verrebbe interpretato non come parte della stringa che si vuole assegnare alla variabile, ma come parte di un comando, che ovviamente non esiste.

L'uso delle variabili può risultare molto comodo, specialmente quando incominceremo ad occuparci della programmazione degli script. Per ora ne mostreremo solo alcune interessanti applicazioni.

Ad esempio, una variabile può contenere non solo nomi e stringhe, ma un file intero o il contenuto di una directory, vediamo come:

FACCIAMOUNAPROVA=`cat /etc/HOSTNAME`

questo significa che voglio assegnare alla variabile in questione l'output del comando cat /etc/HOSTNAME, il fatto che a FACCIAMOUNAPROVA venga assegnato il risultato di un comando anziché la stringa ``cat /etc/HOSTNAME'' dipende dall'uso dell'operatore accento grave, che appunto assolve a questa funzione.

L'operatore accento grave si ottiene con la combinazione di tasti ALT 96 (96 deve essere digitato dal tastierino alfanumerico). Facendo

echo $FACCIAMOUNAPROVA

otterrei appunto

bilbo.comeon.org

che è il contenuto del file /etc/HOSTNAME.

5.2 L'operatore accento grave, redirezione dell'I/O

L'operatore accento grave riveste una notevole importanza e può essere usato in molto casi e/o applicazioni.

Come già visto serve ad usare il risultato di un comando come input per una variabile d'ambiente oppure per un altro comando. Vediamone qualche esempio:

MIAVAR="Il file prg.culturale.1 contiene "`cat \
        prg.culturale.1|wc -w`" parole"
echo $MIAVAR
Il file prg.culturale.1 contiene 2237 parole

vediamo quello che è successo

Può sembrare difficile, o complicato, anche perché l'uso delle pipe e di alcuni filtri non è stato ancora approfondito, seppure vi sia stato qualche accenno nel primo capitolo.

In realtà non lo è affatto, una volta che avrete preso la mano con questo genere di filosofia, vi verrà tutto molto spontaneo e scontato.

Per quanto riguarda l'uso dei filtri e della pipe, questo esempio è stato messo apposta, perché pur se in seguito approfondiremo maggiormente questi argomenti, riteniamo che sia opportuno fin da ora cominciare a fare l'abitudine a questo tipo di concatenazione fra i comandi.

Vediamo qualche altro esempio.

L'esempio seguente calcola e stampa la percentuale di quote in un messaggio. La forma e la quantità delle istruzioni è stata volutamente resa più complessa di quanto poteva essere, al fine di mostrare come possono interagire fra loro comandi redirezione dell'input e dell'output

grep -i . msg > result;TOTL=`cat result|wc -l`;TOTQ=`grep -i ">" \
result|wc -l`;echo "( $TOTQ / $TOTL ) "*" 100"|bc -l|cut -f1 -d'.'\
> quotes; QUOTEPER=`cat quotes`

Il messaggio originale era il seguente:

Ciao Pako.

Il 08 Jan 96, Pako scrive a Eraldo Corti:

 :>> C'è qualcuno???
 :>> Esiste quest'area???

 P> heilà! Benvenuto...

grazie...

 P> ti invitiamo a far chiasso finché non arrivano i cd e partirà il
 P> prog. culturale... beninteso che chiasso=discussioni di qualunque
 P> tipo su Linux e ComeOn Linux!

certo... Provvederò...

Ciao. @:) Eraldo.

A questo punto la variabile QUOTEPER può essere utilizzata ad esempio in output ad un programma che fa le statistiche sul quoting dei messaggi:

echo "Il messaggio msg contiene il $QUOTEPER % di linee quotate"

Come si vede, gli esempi in questa sezione sono volutamente accentuati, ma rappresentano un buon punto di partenza per lo studio dei vari operatori di redirezione e di pipe, nonché danno un accenno sull'uso di alcuni filtri, quali ad esempio wc, cut e grep.

Un buon esercizio sarebbe quello di rendere in forma più semplice questi ultimi due esempi.

5.3 Il comando alias

In /etc/profile abbiamo visto anche la presenza di un comando alias.

alias è un utilissimo strumento che consente in maniera semplice, ma molto efficace, di personalizzare ulteriormente il sistema operativo.

In pratica tramite il comando alias è possibile ridefinire il nome e la funzione di comandi originali, oppure di crearne di nuovi più sofisticati.

Es: alias l='ls -l'

aggiungendo questa riga in /etc/profile avrete creato il nuovo comando l che ha la funzione di visualizzare una lista lunga delle directory.

alias shut='shutdown -t15 -hfn now'

questo fa sì che abbiate creato il nuovo comando shut, che esegue uno shutdown della macchina.

alias rm='rm -i'

in questo modo avrete ridefinito il comando rm, facendo in modo che vi chieda ogni volta conferma per la cancellazione di un file

alias untgz='tar -zxvf'

Crea il comando untgz, che scompatta i file in formato tgz. Ovvero untgz nomefile.tgz.

Si potrebbe continuare con moltissimi altri esempi, ma credo che ormai abbiate capito l'utilità del comando.

5.4 Il comando adduser

Bene è arrivato il momento di aggiungere un nuovo utente al mio sistema. La cosa può essere fatta sia manualmente che sfruttando un comando del sistema operativo. Il comando in questione è appunto: adduser.

Supponiamo ad esempio che il mio primo utente sia un utente specializzato a leggere e/o scrivere la posta.

Naturalmente dovrà avere accesso a tutti i comandi che servono per realizzare il suo scopo, ma non dovrà poter accedere ai dati di un altro utente del sistema (ad esempio un user loggato al mio sistema, che non avrebbe piacere che un altro utente anche lui specializzato a leggere la posta, che non avrebbe piacere che qualche altro leggesse la sua posta personale).

Inoltre deve poter accedere a 2 o 3 directory condivise con altri utenti, dove vengono mantenute informazioni generali che potrebbero essere utili per rispondere ai messaggi.

La procedura è la seguente:

adduser

Adding a new user. The username should not exceed 8 characters
in length, or you may run into problems later.

Enter login name for new account (^C to quit): wiz

Editing information for new user [wiz]

Full Name: Giuseppe De Marco
GID [100]: 14
Group 'uucp', GID 14
First unused uid is 507

UID [507]:

Home Directory [/home/wiz]:

Shell [/bin/bash]:

Password [wiz]: "azteca"    (tipicamente la password ha un limite
                             di 8 caratteri, password più lunghe
                             vengono di solito troncate)

Adding the files from the /etc/skel directory:
./.kermrc -> /home/wiz/./.kermrc
./.less -> /home/wiz/./.less
./.lessrc -> /home/wiz/./.lessrc
./.term -> /home/wiz/./.term
./.term/termrc -> /home/wiz/./.term/termrc

Vediamo ora di spiegare quanto abbiamo fatto. In realtà il comando adduser è un interfaccia, che crea la seguente riga nel file /etc/passwd:

wiz:DhhywZZ0oHu56:507:14:Giuseppe De Marco:/home/wiz:/bin/bash

inoltre crea la home dell'utente e delle directory e dei file standard (definiti dal superuser) copiandoli dalla dir /etc/skel.

Il file /etc/passwd contiene l'elenco degli utenti riconosciuti dal sistema. Nessun utente potrà loggarsi al sistema se non sarà elencato in questo file.

Ciascuna voce all'interno del file /etc/passwd, sarà così composta:

LOGINNAME:PWD:USERID:GROUPID:UNASTRINGA:HOMEDIR:SHELL

LOGINNAME

indica il nome che l'utente userà per loggarsi al sistema. Noi abbiamo inserito ad esempio ``wiz''

PWD

contiene una password per l'utente in questione. Tipicamente la password viene inserita in una forma codificata (come nell'esempio di cui sopra). Il campo password puo' anche essere lasciato in bianco. (se vi fidate :-)) Potete mettere anche * come password, questo significa che l'utente in questione non sarà accessibile a nessuno se non tramite il comando su.

Il file /etc/passwd è tipicamente accessibile in lettura a tutti gli utenti, quindi se pur codificata, l'esistenza della password potrebbe rappresentare un problema. I più pignoli per risolvere questo usano usare un metodo detto shadow, ovvero nel campo passwd si mette una x, e le password vengono conservate in un file /etc/shadow, non accessibile a tutti (in realtà il problema delle shadow password è molto più complesso, ed ha affollato i vari newsgroup su internet per un bel pezzo, perciò se volete saperne di più consiglio di leggere comp.os.linux.*).

USERID

è un numero fra 0 e 65535 che identifica l'utente. Nel file /etc/passwd tale numero non deve essere ripetuto per identificare più utenti.

GROUPID

contiene il numero del gruppo di cui l'utente fa parte (in questo modo si definiscono i livelli di accesso, ma di questo parleremo in seguito).

UNASTRINGA

un commento, tipicamente il nome per esteso dell'utente o la funzione in cui è specializzato.

HOMEDIR

contiene il percorso completo della dir che verrà usata come home dall'utente in questione.

SHELL

un qualsiasi programma eseguibile, che verrà eseguito subito dopo il login. Tipicamente l'interprete dei comandi (bash, ksh o qualsiasi altra).

Quando l'utente wiz tenterà di accedere al sistema verrà fatto un controllo sul file /etc/passwd, se il suo nome e la sua password coincidono con quelli utilizzati al login, l'utente avrà accesso al sistema altrimenti ne rimarrà fuori.


Previous Next Contents