Capitolo successivo Capitolo precedente Indice

36. Programmi di utilità vari

I modi con cui si possono classificare i programmi di utilità sono molti e tutti potenzialmente validi. Nelle sezioni seguenti vengono mostrati una serie di programmi di utilità che non hanno trovato una diversa collocazione in questo documento.

Esistono molti piccoli programmi il cui nome e le cui funzionalità si confondono con i comandi interni delle shell principali. Quando ciò accade, occorre fare bene attenzione a determinare cosa si sta usando: il comando interno di shell o il programma.

La tabella (seguente) elenca i programmi a cui si accenna in questo capitolo.


Programma Descrizione
echo Emette una o più stringhe.
printf Formatta ed emette delle stringhe.
yes Emette continuamente una stringa.
false Restituisce sempre il valore falso.
true Restituisce sempre il valore vero.
test Valuta una espressione condizionale e ne restituisce il risultato.
expr Valuta una espressione e ne emette il risultato.
tee Fa una copia del flusso dei dati che lo attraversa.
stty Emette o modifica la configurazione del terminale.
tty Emette il nome del proprio terminale.
printenv Emette l'elenco e il contenuto delle variabili di ambiente.
Elenco di alcuni programmi di utilità per uso vario.

36.1 Emissione di testo

Alcuni programmi si occupano di emettere del testo, più o meno formattato, attraverso lo standard output. In pratica queste informazioni vengono normalmente visualizzate, a meno che non si faccia una ridirezione.

$ echo

echo [<opzioni>] [<stringa>... ]

Emette le stringe indicate come argomento, separate da uno spazio e con l'aggiunta di un carattere newline finale.

Opzioni

-n

Sopprime il carattere newline finale, in modo da permettere l'emissione successiva sulla stessa riga.

-e

Abilita l'interpretazione delle sequenze di escape descritte più avanti.

Sequenze di escape

\a   avvisatore acustico;

\b   backspace;

\c   eliminazione del carattere di newline finale;

\f   form feed o <FF>;

\n   newline o <LF>;

\r   carriage return o <CR>;

\t   tabulazione (orizzontale) o <Tab>;

\v   tabulazione verticale;

\\   barra inclinata rovescia;

\nnn   il carattere il cui codice ottale corrisponde al numero indicato da nnn.

$ printf

printf <formattazione> [<argomento>... ]

Emette attraverso lo standard output la stringa di formattazione fornita, utilizzando gli argomenti, con le stesse regole utilizzate dalla funzione printf del linguaggio C.

Variabili di formattazione particolari

\Onnn

Numero ottale della lunghezza di 1 fino a tre cifre (contenenti numeri da 0 a 7).

\xhhh

Numero esadecimale della lunghezza di 1 fino a tre cifre (contenenti cifre da 0 a f).

$ yes

yes [<stringa>... ]

yes emette senza fine, attraverso lo standard output, le stringhe indicate come argomento (separate da uno spazio l'una dall'altra), seguite dal carattere newline. Se non viene indicata alcuna stringa come argomento, emette la lettera y.

Il programma continua la sua esecuzione fino a che non viene interrotto.

Esempi

$ yes [Invio]

y
y
y
y
y
...

Senza argomenti, yes emette una serie indefinita di lettere y seguite da newline.

---------

$ yes n [Invio]

n
n
n
n
n
...

Se vengono specificate delle stringhe come argomento, queste stringhe vengono emesse ripetitivamente.

---------

$ yes | mioprog

Si inviano una serie di lettere y, seguite da newline, al programma ipotetico mioprog che probabilmente tende a fare una serie di domande alle quali si vuole rispondere sempre con una lettera y.

36.2 Espressioni

Alcuni programmi sono particolarmente indicati per la costruzione di espressioni e per questo motivo, il risultato della loro elaborazione si traduce essenzialmente nella restituzione di un valore (exit status).

$ false

false

false è un programma banale che restituisce semplicemente il valore 1, corrispondente in pratica a falso.

$ true

true

true è un programma banale che restituisce semplicemente il valore 0, corrispondente in pratica a vero.

$ test

test <espressione-condizionale>

Risolve (valuta) l'espressione indicata. Il valore restituito può essere vero (corrispondente a zero) o falso (corrispondente a 1) ed è pari al risultato della valutazione dell'espressione. Le espressioni possono essere unarie o binarie. Le espressioni unarie sono usate spesso per esaminare lo stato di un file. Vi sono operatori su stringa e anche operatori di comparazione numerica. Ogni operatore e operando deve essere un argomento separato. Se i file vengono espressi nella forma /dev/fd/n, allora si fa riferimento al descrittore di file n.

Test sul tipo di file

-b file

vero se il file esiste ed è un dispositivo a blocchi.

-c file

vero se il file esiste ed è un dispositivo a caratteri.

-d file

vero se il file esiste ed è una directory.

-f file

vero se il file esiste ed è un file normale.

-h | -L file

vero se il file esiste ed è un link simbolico.

-p file

vero se il file esiste ed è una pipe con nome.

-S file

vero se il file esiste ed è un <socket>.

-t [<file-descriptor>]

vero se il descrittore di file indicato è aperto su un terminale. Se non viene indicato l'argomento, si intende 1 che corrisponde allo standard output.

Test sui permessi di accesso

-g file

vero se il file esiste ed è impostato il suo bit SGID.

-u file

vero se il file esiste ed è impostato il suo bit SUID.

-k file

vero se il file ha il suo bit sticky impostato.

-r file

vero se il file esiste ed è leggibile.

-w file

vero se il file esiste ed è scrivibile.

-x file

vero se il file esiste ed è eseguibile.

-O file

vero se il file esiste e appartiene all'UID efficace dell'utente attuale.

-G file

vero se il file esiste ed appartiene al GID efficace dell'utente attuale

Test sulle caratteristiche dei file

-e file

vero se il file esiste ed è di qualunque tipo.

-s file

vero se il file esiste ed ha una dimensione maggiore di zero.

<file1> -nt <file2>

vero se <file1> è più recente (in base alla data di modifica) di <file2>.

<file1> -ot <file2>

vero se <file1> è più vecchio (in base alla data di modifica) di <file2>.

<file1> -et <file2>

vero se i due file sono sullo stesso dispositivo e hanno lo stesso numero di inode. Ciò accade quando si creano degli hard link.

Test su stringhe

-z <stringa>

vero se la lunghezza della stringa è zero.

-n <stringa>

vero se la lunghezza della stringa è diversa da zero.

<stringa1> = <stringa2>

vero se le stringhe sono uguali.

<stringa1> != <stringa2>

vero se le stringhe sono diverse.

Test di confronto numerico

<argomento1> <operando> <argomento2>

Il risultato dipende dall'operando utilizzato.

Operandi

-eq   uguale a;

-ne   diverso da;

-lt   minore di;

-le   minore o uguale a;

-gt   maggiore di;

-ge   maggiore o uguale a;

Gli argomenti da confrontare possono essere interi positivi, interi negativi, o la espressione speciale -l <stringa> che calcola la lunghezza della stringa stessa.

Operatori booleani

! <espressione>

vero se il risultato dell'espressione è falso.

<espressione1> -a <espressione2>

vero se entrambe le espressioni danno un risultato vero.

<espressione1> -o <espressione2>

vero se almeno una delle due espressioni da un risultato vero.

Esempi

$ test 1 -gt 2 && echo "ok" [Invio]

ok

$ test -d /bin && echo "/bin è una directory" [Invio]

/bin è una directory

$ expr

expr valuta un'espressione e ne emette il risultato attraverso lo standard output. Ogni elemento dell'espressione deve essere un argomento separato.

Gli operandi possono essere numeri o stringhe a seconda del tipo di operazione che si intende applicare.

Se vengono usate le parentesi, è molto probabile che la shell utilizzata costringa a proteggerle attraverso tecniche di quoting.

Exit status

Il valore restituito da expr dipende essenzialmente dal risultato dell'espressione nel modo seguente:

Operatori logici

Le espressioni possono essere concatenate attraverso degli operatori logici.

<!>   Per comprenderne intuitivamente il significato, occorre considerare che in questo caso, un valore numerico maggiore di zero viene considerato vero, mentre un valore numerico pari a zero, oppure un valore nullo, viene considerato pari a falso. In questo senso occorre fare attenzione a non fare confusione con la valutazione che si fa invece sui valori restituiti da un programma o da un comando di shell.

---------

|

È simile all'operatore OR: se la prima delle due espressioni genera un risultato diverso da zero e dal valore nullo, il risultato globale è questo; altrimenti il risultato è quello della seconda.

&

È simile all'operatore AND: se entrambe le espressioni generano un risultato diverso da zero e dal valore nullo, il risultato globale è quello della prima espressione; altrimenti il risultato è zero.

Operatori di comparazione

Gli operatori di comparazione sono i soliti che si usano in matematica:

Se la comparazione è corretta (vero), genera il valore 1, altrimenti si ottiene 0.

expr tenta inizialmente di considerare gli operatori da confrontare come numerici; se in questo modo fallisce l'operazione, tenta quindi di eseguire una comparazione lessicografica.

Espressioni numeriche

Gli operatori numerici sono i soliti che si usano in matematica:

Espressioni su stringhe

<stringa> : <espressione-regolare>

L'operatore : viene usato per comparare una stringa con una espressione regolare. Questa espressione regolare può essere solo di tipo elementare e si considera che contenga implicitamente un accento circonflesso (^) iniziale.

L'espressione regolare può contenere una coppia di parentesi tonde protette nel modo seguente: \(...\). Se vengono usate, il risultato di questa comparazione sarà la parte di stringa che corrisponde alla parte di espressione regolare racchiusa tra queste parentesi. Se non vengono usate, il risultato è il numero di caratteri che corrispondono.

Se la comparazione fallisce e sono state usate le parentesi \( e \), il risultato è una stringa nulla. Se la comparazione fallisce e non sono state usate queste parentesi, il risultato è zero.

match <stringa> <espressione-regolare>

Questa sintassi è un modo alternativo per eseguire una comparazione di stringhe. Si comporta in modo identico all'uso dell'operatore :.

---------

substring <stringa> <posizione> <lunghezza>

Restituisce una sottostringa a partire dalla posizione indicata per una lunghezza massima stabilita. Se uno dei valori usati per indicare la posizione o la lunghezza è negativo, il risultato è la stringa nulla.

index <stringa> <set-di-caratteri>

Restituisce la prima posizione all'interno della stringa, a cui corrisponde uno dei caratteri che compone il set di caratteri.

length <stringa>

Restituisce la lunghezza della stringa.

Esempi

$ export miavar=2 [Invio]

$ expr $miavar + 1 [Invio]

3

Viene creata la variabile miavar assegnandole il valore 2, quindi calcola la somma tra il suo contenuto e 1.

---------

$ expr abc : 'a\(.\)c' [Invio]

b

Estrae dalla stringa la lettera centrale attraverso l'espressione regolare.

---------

$ expr index ambaraba br [Invio]

3

Cerca la prima posizione all'interno della stringa ambaraba che corrisponda alla lettera b, oppure alla lettera r.

36.3 Ridirezione

La ridirezione dei flussi di input e di output dei programmi viene svolto dalle shell. Il programma tee è molto importante in queste situazioni perché permette di copiare in un file il flusso di dati che lo attraversa.

$ tee

tee [<opzioni>] [<file>... ]

Copia lo standard input nello standard output e anche nei file indicati come argomento. Si tratta quindi di un filtro che permette di copiare i dati in transito in un file.

Alcune opzioni

-a | --append

Aggiunge (append) i dati ai file di destinazione invece di sovrascriverli.

-i | --ignore-interrupts

Ignora i segnali di interruzione.

36.4 Contesto operativo

Alcuni programmi si occupano di mostrare o modificare il contesto in cui si opera.

$ stty

stty [<opzioni>]

stty [<configurazione>]

stty permette di modificare o di conoscere la configurazione del proprio terminale.

Vedere info stty oppure stty(1).

$ tty

tty [<opzioni>]

tty emette attraverso lo standard output il nome del terminale con cui si è connessi.

Alcune opzioni

-s | --silent | --quiet

Non emette alcuna segnalazione, si limita a restituire un valore.

Exit status

$ printenv

printenv [<opzioni>] [<variabile>... ]

printenv emette attraverso lo standard output il contenuto delle variabili indicate come argomento. Se viene usato senza argomenti, emette il contenuto di tutte.

L'uso di questo programma è utile quando la shell di cui si dispone non permette di espandere una variabile.

Exit status

Esempi

$ printenv PATH

Mostra il contenuto della variabile PATH.

 

1997.10.26 - Scritto da Daniele Giacomini   daniele@calion.com   (vedi copyright: Appunti Linux).


Capitolo successivo Capitolo precedente Indice