Crea sito

Sintassi e funzionalità di base della riga di comando

6 / 100

Per comprendere le reali capacità della shell e trattare la sintassi della riga di comando occorre prima approfondire le modalità con cui la shell legge una riga dalla tastiera, riconosce qual è il programma che volete mettere in esecuzione, ricostruisce i vari argomenti da passare al programma stesso, e poi lo esegue. L’invocazione generica di un qualunque comando e nella forma:9

comando -o -v valore –altra-opzione argomento1 –riopzione=valore arg2

da scrivere sulla stessa riga e terminare con la pressione del tasto di invio.

La pressione del tasto di invio su un terminale infatti serve a \scaricare” la linea appena scritta in modo che questa possa essere letta in ingresso dal programma che usa il terminale (nel nostro caso la shell). Se si vuole scrivere un comando su piu righe andando a capo occorrera proteggere la pressione del tasto di invio; questo si fa utilizzando il carattere \\” come ultimo carattere della riga, vedremo piu avanti che \\” puo essere usato nello stesso modo con gli altri caratteri.

La sintassi elementare della shell prevede che si scriva all’inizio della riga (eventuali spazi antistanti verranno comunque ignorati) il nome del comando da eseguire, seguito da eventuali opzioni ed argomenti. Si tenga presente che la shell, per identi care il comando e separarlo da opzioni e argomenti, e separare questi ultimi fra di loro, usa caratteri vuoti come lo spazio o il tabulatore. La presenza cioe di uno o piu spazi o tabulatori dice che si sta passando dal nome del comando ad un argomento o opzione, o da un argomento/opzione al successivo. Lo stesso dicasi qualora si vada a capo su una nuova riga con l’uso del “\“.

Per questo motivo il nome di un comando non contiene spazi, inoltre la stragrande maggioranza dei comandi usa nomi scritti esclusivamente in lettere minuscole, si ricordi infatti che un sistema unix-like e case-sensitive, fa differenza cioe fra maiuscole e minuscole. I soli caratteri non alfabetici utilizzati nei nomi dei comandi, in genere assai poco, sono il “-” e il” _” ed eventualmente i numeri. Gran parte degli altri caratteri infatti, come vedremo fra breve, vengono interpretati dalla shell assumendo signi cati speciali, e pertanto di nuovo non possono essere inseriti nel nome del comando, almeno non senza prendere adeguate precauzioni, analoghe a quelle che vedremo piu avanti per gli argomenti, il che poi fa s che si nisca per usare nomi con semplici caratteri alfanumerici.La differenza fra opzioni e argomenti e che le prime attivano funzionalità o modalità di operazione specifiche del comando, mentre i secondi indicano gli oggetti, solitamente dei file, su cui questo opera. In realtà il meccanismo e un po’ piu complesso, e puo essere compreso nei dettagli solo con un po’ di nozioni di programmazione.Quello che in effetti fa la shell è identi care il programma da usare sulla base del nome del comando, per poi spezzare l’intera riga in una lista di stringhe che verranno passate al suddetto programma come argomenti iniziali.Per gestire gli argomenti e le opzioni passate dalla linea di comando la gran parte dei pro-grammi utilizzano una serie di funzioni fornite dalla libreria fondamentale del sistema, la GNU C library.

Per i programmi che usano queste funzionalità questo comporta la presenza di un formato della riga di comando abbastanza uniforme, mostrato appunto nell’esempio precedente, con la possibilità di distinguere fra opzioni e argomenti, e di specificare questi in un ordine qualunque. Si tenga presente che questo non e sempre vero, dato che non tutti i programmi fanno ricorso a queste funzionalità . Per questo motivo troveremo in seguito diverse eccezioni, ad esempio in cui l’ordine conta, o in cui le opzioni vanno speci cate prima degli argomenti. Nel comportamento comune le opzioni sono sempre costituite da un carattere “” seguito da una lettera ed in rari casi anche da numeri o caratteri non alfabetici, a cui puo seguire (separato o meno da uno spazio) un eventuale valore passato come parametro, ma non tutte le opzioni prevedono parametri, nel qual caso va specificata solo la lettera dell’opzione. Se si speci cano piu opzioni e normalmente supportata anche la possibilita di indicarle con piu lettere scritte di la dopo un “” iniziale.

Facciamo un esempio; si consideri di aver scritto su un terminale una riga di comando contenente qualcosa del tipo:

rm -f pippo pluto paperino

la shell capirà che si intende invocare il comando rm e, individuato su disco il file che contiene il relativo programma, lo lancerà passandogli come argomenti le cinque stringhe presenti nella riga precedente. La prima stringa, rm, contiene il nome del programma e di norma viene ignorata, le restanti invece verranno analizzate dal programma; cos -f verra identi cata come opzione men-tre, non necessitando questa di nessun parametro, pippo, pluto e paperino verranno considerati come argomenti, che nel caso indicano i le da cancellare. In realt alcuni programmi usano anche il nome stesso con cui vengono invocati per modi care il loro comportamento, un esempio classico di questo comportamento e gzip, un compressore di file che puo essere invocato anche come gunzip (in genere entrambi i comandi sono presenti come hard link allo stesso le eseguibile) nel qual caso decomprimera invece di comprimere Si ricordi infine che quanto detto attiene all’uso piu elementare della sintassi usata dalla shell, quello in cui si esegue un comando scrivendone per esteso il nome con le relative opzioni ed argomenti.

La scelta del prompt dipende dai gusti e dall’uso: se ci si trova a lavorare contemporanea-mente con diversi utenti, su computer diversi, allora sar utile sapere con quale utente e su quale macchina si sta operando in un certo terminale; altrimenti si puo farne a meno e risparmiare spazio sulla linea di comando con un valore di PS1 come \\$“.

Al di la dell’estetica del prompt il compito principale della shell e quello di mettere a dispo-sizione dell’utente un’interfaccia che gli consenta di utilizzare al meglio il sistema; per questo essa fornisce una serie di funzionalit che permettono di rendere piu e cace l’uso dei comandi. Una delle funzionalit fondamentali e quella delle variabili di shell; la shell permette cioe di de nire e modi care delle variabili a cui si puo fare riferimento in un secondo tempo. Per farlo la sintassi elementare della riga di comando vista in precedenza cambia e si deve utilizzare una riga contenente un’assegnazione nella forma:VARIABILE=valore

Se la variabile non esiste viene creata e assegnata, altrimenti viene reimpostata al valore speci cato. Si noti che non ci sono spazi a separare il nome della variabile, l’operatore “=” ed il valore. In presenza di spazi infatti la shell interpreterebbe il tutto come il nome di un comando, e probabilmente riporterebbe un errore non trovando un programma corrispondente. Si tenga presente comunque che la shell supporta anche la possibilita di eseguire un comando una volta e ettuata l’assegnazione di una variabile, nel qual caso questo dovra essere speci cato, separato da uno spazio, nel seguito della riga di comando.

Per convenzione le variabili di shell hanno nomi scritti con lettere maiuscole, ma questa e appunto solo una convenzione, dovuta al fatto che cos e piu di cile confonderle con i comandi; in realt e possibile usare qualunque tipo di lettera e, eccezion fatta per il primo carattere, anche qualunque numero ed il carattere di sottolineatura “_“.

Una volta definita una variabile di shell e possibile richiamarne il valore sulla riga di comando anteponendo al nome della variabile il carattere “$“; così se ad esempio si e inserito nella variabile MAIL il nome del file in cui si trova la propria posta elettronica, si potra verificarne dimensioni e permessi con un comando del tipo:

[email protected]:~$ ls -l $MAIL

-rw-rw—-          1 piccardi mail                  4136 Aug 25 17:30 /var/mail/piccardi

Questo perchè la shell, quando incontra il carattere “$” seguito dal nome di una variabile, esegue quella che viene comunemente chiamata una “variable expansion”,sostituisce cioe il riferimento alla variabile (nel caso $MAIL) con il valore della stessa (nel caso /var/mail/piccardi), passando il risultato, come argomento o come opzione a seconda di dove lo si e scritto, al comando che viene eseguito.

Un elenco delle principali variabili predefinite riconosciute dalla shell e riportato in tab. mentre per l’elenco completo e la descrizione di tutti i loro e etti si puo consultare la sezione \Shell Variables” della pagina di manuale.

VariabileSigni cato
  
BASH_ENVse impostata viene usata nell’esecuzione degli script
  come l’indicazione del  le da cui leggere eventuali
 impostazioni di inizializzazione.
GLOBIGNOREuna lista, separata da \:“, di nomi di  le da ignorare nel
 lename globbing.
HISTFILEil  le in cui viene memorizzata la storia dei comandi.
HISTFILESIZEil massimo numero di linee da mantenere nel  le della storia
 dei comandi.
HISTSIZEil numero di comandi da mantenere nella storia dei comandi.
HOMEla home directory dell’utente, viene usata anche dal comando
 interno cd.
HOSTNAMEil nome della macchina.
IFSelenco dei caratteri che separano in campi diversi il risultato
 di una espansione di shell.
LANGla localizzazione utilizzata dai programmi
OSTYPEla descrizione del sistema operativo corrente.
PATHla lista delle directory in cui si trovano i comandi.
PS1la stringa che indica il formato del prompt.
PWDla directory di lavoro corrente.
SHLVLlivello della subshell
TERMil tipo di terminale su cui si sta operando (usata per cambiare
 le formattazioni dei dati stampati laddove esistano speci ci
 supporti).
USERl’username dell’utente.

Una delle altre funzionalità che la shell fornisce con l’uso delle variabili e quella dell’ambiente (in inglese environment). Esso e una funzionalità messa a disposizione dal sistema che viene usata per poter utilizzare il valore di alcune variabili di shell anche all’interno dei programmi che questa mette in esecuzione Per visualizzare le variabili di shell presenti nell’ambiente si puo usare lo stesso export senza specifjcare nulla, e si otterrà la lista delle variabili presenti nell’ambiente, precedute dalla dichiarazione \declare -x“; la lista infatti viene stampata in un formato pronto per essere salvato su un le ed usato come script per ricreare l’ambiente. Se si vuole solo una semplice lista di nomi con il relativo valore si puo usare il comando env. Questo comando in generale permette di eseguire un altro comando, da passare come argomen-to, fornendogli un ambiente modi cato rispetto a quello corrente della shell; con l’opzione -i infatti l’ambiente viene completamente svuotato, mentre con una serie di opzioni -u si possono cancellare altrettante variabili di ambiente (da speci care come parametro per l’opzione). Se si invoca env senza argomenti il comando si limita a stampare la lista delle variabili di ambiente, nella classica forma VARIABILE=valore Una variabile molto importante ma poco nota, ed il cui significato spesso viene frainteso, e IFS, il cui nome sta perInternal Field Separator. Questa variabile viene utilizzata per indicare lalista di caratteri che devono essere considerati come separatori nei risultati di una espansione di shell ed il suo valore di default e impostato alla sequenza spazio, tabulatore, ritorno a capo. La variabile e importante perch ha un e etto diretto, la cui comprensione non e proprio immediata, sul risultato dell’interpretazione della riga di comando. Si tenga presente pero che IFS non ha nessun effetto sulla scansione di una linea di comando ordinaria che non contiene espansioni. Infatti nella costruzione degli argomenti prima viene e ettuata una scansione iniziale, per la quale vengono usati come separatori solo i caratteri di spaziatura, una eventuale espansione di shell viene sempre e ettuata in un secondo passo e solo a questo punto possono entrare in gioco i caratteri elencati in IFS.

Di altrettanta se non maggiore rilevanza e la variabile PATH che e direttamente connessa ad una delle funzionalit della shell su cui nora abbiamo sorvolato, dandola per scontata: quella del cosiddetto path search, cioe del fatto che la shell permette di associare automaticamente un nome, scritto sulla linea di comando, ad un programma da lanciare. In genere, a meno dell’uso degli alias su cui torneremo a breve, questo nome deve corrispondere al nome del le che contiene il programma che la shell deve eseguire. In sostanza, come visto nell’esempio iniziale di sez. 2.1.3, si puo sempre scrivere solo il nome del le al posto del pathname completo, se cioe si vuole leggere una pagina di manuale, baster scrivere man e non sar necessario speci care /usr/bin/man.

Si puo fare cos perch la shell esegue automaticamente una ricerca nel cosiddetto PATH dei comandi; cioe dato un nome sulla linea di comando la shell cerca un le da eseguire con quel nome nella lista di directory contenute nella variabile d’ambiente PATH. Se si vuole evitare questo comportamento, ad esempio perch il programma che si vuole lanciare non e in una di quelle directory e non sarebbe trovato, e necessario speci care, sia in forma assoluta che relativa, il pathname per accedere al comando, la shell riconosce che si vuole fare questo quando nel nome del comando compare il carattere \/“, che indica una directory. Ad esempio per lanciare un comando (o uno script) nella directory corrente si usa la sintassi:

./comando

La variabile PATH ha la forma di una lista di pathname di directory, separati fra loro da un carattere di due punti, un formato comune usato nelle variabili di ambiente tutte le volte che si deve speci care una lista di directory in cui e ettuare ricerche per le directory dove sono mantenute le librerie di sistema). Un esempio del valore di questa variabile potrebbe essere il seguente:

/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games

come e presa dalla definizione standard per un utente comune su Debian.

ALIAS

Un’ulteriore funzionalit che la shell mette a disposizione e quella degli alias: prima ancora di cercare se il nome di un comando corrisponde ad un programma presente in una delle directory indicate in PATH, la shell controlla se esso corrisponde ad un alias; ci permette cos di ideare nuovi comandi, de nire abbreviazioni per quelli piu usati, o ride nire lo stesso nome di un comando per farlo comportare in maniera diversa.

Un alias si crea con il comando interno alias associando un nome ad un altro comando (che puo a sua volta essere stato de nito in un altro alias) con una sintassi del tipo:

alias ll=’ls –color=auto                  -l’

ma si puo anche de nire una abbreviazione con:

alias l=’ls -l’

o ride nire un comando esistente con:

alias rm=’rm -i’

In questo modo nel primo caso si de nisce una versione colorata e \prolissa” di ls, nel secondo una abbreviazione per l’uso di ls -l e nel terzo si ride nisce rm in modo che di default sia richiesta conferma nella cancellazione dei le. Per cancellare un alias si puo usare il comando unalias seguito dal nome dello stesso. Qualora invece si esegua il comando alias senza speci care nulla questo mostrera la lista degli alias gia definiti.

Translate »