[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico] [volume] [parte]


Capitolo 83.   Programmi di servizio diversi

I modi con cui si possono classificare i programmi di servizio sono molti e tutti potenzialmente validi. Nelle sezioni seguenti vengono mostrati una serie di programmi di servizio 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 83.1 elenca i programmi a cui si accenna in questo capitolo.

Tabella 83.1. Elenco di alcuni programmi di servizio per uso vario.

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 un'espressione condizionale e ne restituisce il risultato.
expr Valuta un'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.
sleep Attende per una durata di tempo determinato.

83.1   Emissione di testo

Alcuni programmi si occupano di emettere del testo, più o meno formattato, attraverso lo standard output. Di solito, queste informazioni vengono visualizzate, quando non si fa una ridirezione esplicita.

83.1.1   $ echo

echo [opzioni] [stringa...]

Emette le stringhe indicate come argomento, separate da uno spazio e con l'aggiunta di un codice di interruzione di riga finale. echo (1) riconosce alcune sequenze di escape che possono essere utili per formattare il testo da visualizzare. Queste sono elencate nella tabella 83.2.

Tabella 83.2. Elenco delle sequenze di escape riconosciute da echo.

Codice Descrizione
\\ Inserisce la barra obliqua inversa (\).
\a Inserisce il codice <BEL> (avvisatore acustico).
\b Inserisce il codice <BS> (backspace).
\c Alla fine di una stringa previene l'inserimento di una nuova riga.
\f Inserisce il codice <FF> (formfeed).
\n Inserisce il codice <LF> (linefeed).
\r Inserisce il codice <CR> (carriage return).
\t Inserisce una tabulazione normale (<HT>).
\v Inserisce una tabulazione verticale (<VT>).
\nnn Inserisce il carattere corrispondente al codice ottale n.
Opzioni

-n

Sopprime il codice di interruzione di riga finale, in modo da permettere l'emissione successiva sulla stessa riga.

-e

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

83.1.2   $ printf

printf formattazione [argomento...]

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

Variabili di formattazione particolari

\Onnn

Numero ottale composto da una a tre cifre, ognuna con valori compresi tra zero e sette.

\xhhh

Numero esadecimale composto da una a tre cifre, ognuna con valori compresi tra zero e la lettera «f».

83.1.3   $ yes

yes [stringa...]

yes (3) emette ripetitivamente senza fine, attraverso lo standard output, le stringhe indicate come argomento (separate da uno spazio l'una dall'altra), seguite dal codice di interruzione di riga. 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 dal codice di interruzione di riga.

yes n[Invio]

n
n
n
n
n
...

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

yes | mio_prog

Si inviano una serie di lettere «y», seguite dal codice di interruzione di riga, al programma ipotetico mio_prog che probabilmente tende a fare una serie di domande alle quali si vuole rispondere sempre con una lettera «y».

83.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).

83.2.1   $ false

false

false (4) è un programma banale che restituisce semplicemente il valore uno, corrispondente in pratica a Falso nell'ambito dei comandi di shell.

83.2.2   $ true

true

true (5) è un programma banale che restituisce semplicemente il valore zero, corrispondente in pratica a Vero nell'ambito dei comandi di shell.

83.2.3   $ test

test espressione_condizionale

Risolve (valuta) l'espressione indicata. Il valore restituito può essere Vero (corrispondente a zero) o Falso (corrispondente a uno) 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. (6)

Per fare riferimento a un descrittore di I/O (per esempio uno dei flussi di dati standard), si può indicare un file nella forma /dev/fd/n, dove il numero finale rappresenta l'n-esimo descrittore. In alternativa, si può fare riferimento direttamente ai file /proc/self/fd/n, secondo lo standard del kernel Linux.

Nella tabella 83.3 e in quelle successive, vengono elencate le espressioni elementari che possono essere utilizzate in questo modo.

Tabella 83.3. Espressioni per la verifica del tipo di file.

Espressione Descrizione
-e file Vero se il file esiste ed è di qualunque tipo.
-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.
-L file Vero se il file esiste ed è un collegamento simbolico.
-p file Vero se il file esiste ed è una pipe con nome (un file FIFO).
-S file Vero se il file esiste ed è un socket.
-t descrittore_file Vero se il descrittore indicato è aperto su un terminale.
-t Vero se lo standard output è aperto su un terminale.

Tabella 83.4. Espressioni per la verifica dei permessi e delle modalità dei file.

Espressione Descrizione
-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 bit Sticky attivo.
-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 al numero UID efficace dell'utente attuale.
-G file Vero se il file esiste e appartiene al GID efficace dell'utente attuale.

Tabella 83.5. Espressioni per la verifica di altre caratteristiche dei file.

Espressione Descrizione
-s file Vero se il file esiste e ha una dimensione maggiore di zero.
file_1 -nt file_2 Vero se il primo file ha la data di modifica più recente.
file_1 -ot file_2 Vero se il primo file ha la data di modifica più vecchia.
file_1 -et file_2 Vero se i due nomi corrispondono allo stesso inode.

Tabella 83.6. Espressioni per la verifica e la comparazione delle stringhe.

Espressione Descrizione
-z stringa Vero se la lunghezza della stringa è zero.
-n stringa Vero se la lunghezza della stringa è diversa da zero.
stringa_1 = stringa_2 Vero se le stringhe sono uguali.
stringa_1 != stringa_2 Vero se le stringhe sono diverse.
stringa_1 < stringa_2 Vero se la prima stringa è lessicograficamente precedente.
stringa_1 > stringa_2 Vero se la prima stringa è lessicograficamente successiva.

Tabella 83.7. Espressioni per il confronto numerico. Come operandi possono essere utilizzati numeri interi, positivi o negativi, oppure l'espressione speciale -l stringa che restituisce la lunghezza della stringa indicata.

Espressione Descrizione
op_1 -eq op_2 Vero se gli operandi sono uguali.
op_1 -ne op_2 Vero se gli operandi sono differenti.
op_1 -lt op_2 Vero se il primo operando è inferiore al secondo.
op_1 -le op_2 Vero se il primo operando è inferiore o uguale al secondo.
op_1 -gt op_2 Vero se il primo operando è maggiore del secondo.
op_1 -ge op_2 Vero se il primo operando è maggiore o uguale al secondo.

Tabella 83.8. Operatori logici.

Espressione Descrizione
! espressione Inverte il risultato logico dell'espressione.
espressione -a espressione Vero se entrambe le espressioni danno un risultato Vero.
espressione -o espressione Vero se almeno un'espressione dà un risultato Vero.
Esempi

test 1 -lt 2 && echo "ok"[Invio]

ok

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

/bin è una directory

83.2.4   $ expr

expr (7) 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 le tecniche che la stessa mette a disposizione.

Valore di uscita

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

  • 0   se il risultato è diverso sia dal valore nullo che da zero;

  • 1   se il risultato è nullo oppure zero;

  • 2   se l'espressione non è valida.

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 confondersi 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:

  • <   minore;

  • <=   minore o uguale;

  • =   uguale;

  • ==   identicamente uguale (di fatto equivalente alla notazione =);

  • !=   diverso;

  • >   maggiore;

  • >=   maggiore o uguale.

Se la comparazione è corretta (Vero), genera il valore uno, altrimenti si ottiene zero.

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:

  • +   addizione;

  • -   sottrazione;

  • *   moltiplicazione;

  • /   divisione;

  • %   resto o modulo.

Espressioni su stringhe

stringa : espressione_regolare

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

L'espressione regolare può contenere una coppia di parentesi tonde protette nel modo seguente: \(...\). Se vengono usate, il risultato di questa comparazione sarà la 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 insieme_di_caratteri

Restituisce la prima posizione all'interno della stringa, a cui corrisponde uno dei caratteri che compone l'insieme 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.

83.3   Ridirezione

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

83.3.1   $ tee

tee [opzioni] [file...]

Emette attraverso lo standard output quanto ricevuto dallo standard input, facendone una copia anche nei file indicati come argomento. Si tratta quindi di un filtro che permette di copiare i dati in transito in un file. (9)

Alcune opzioni

-a | --append

Aggiunge i dati ai file di destinazione, accodandoli, invece di sovrascriverli.

-i | --ignore-interrupts

Ignora i segnali di interruzione.

83.4   Contesto operativo

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

83.4.1   $ printenv

printenv [opzioni] [variabile...]

printenv (10) 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.

Valore di uscita
  • 0   se sono state trovate tutte le variabili specificate;

  • 1   se almeno una variabile non è stata trovata;

  • 2   se si è verificato un errore di scrittura.

Esempi

printenv PATH

Mostra il contenuto della variabile PATH.

83.5   Pause

Nella scrittura di script ci sono situazioni in cui è necessario fare delle pause, per permettere il completamento di qualcosa che non può essere controllato in modo sequenziale.

83.5.1   $ sleep

sleep durata

sleep (11) attende per il tempo indicato come argomento, quindi termina la sua esecuzione. La durata si esprime attraverso un numero seguito da una lettera che ne definisce l'unità di misura.

Esempi

sleep 10s

Attende 10 secondi e quindi termina la sua esecuzione.

sleep 5m

Attende cinque minuti e quindi termina la sua esecuzione.

83.6   Elaborazioni matematiche

Benché esistano dei programmi specifici per le elaborazioni matematiche, come BC (parte lx), alle volte dei programmi di servizio più semplici possono essere ugualmente utili.

83.6.1   $ factor

factor [numero]...

factor (12) consente di calcolare i fattori di un numero, ovvero la serie di numeri primi, moltiplicando i quali si ottiene il numero di partenza. Per esempio,

factor 12345

restituisce il messaggio

12345: 3 5 823

con il quale si comprende che si ottiene 12 345 moltiplicando i numeri primi 3, 5 e 823.

83.6.2   $ seq

seq [opzioni] [numero_iniziale [passo]] numero_finale

seq (13) consente di ottenere una sequenza numerica a partire da un valore iniziale, fino a un valore finale massimo, con una cadenza prestabilita. Se si omette l'indicazione del passo, si intende una scansione unitaria; inoltre, se si omette anche il valore iniziale, si intende implicitamente che si tratti di uno. In pratica,

seq 1 1 4

restituisce attraverso lo standard output la sequenza seguente:

1
2
3
4

La stessa cosa si ottiene con

seq 1 4

e anche con

seq 4

perché il passo e il valore iniziale sono quelli predefiniti.

Attraverso le opzioni è possibile controllare il formato dell'elenco di numeri, così come si può cambiare anche il modo di separarli. Tuttavia, rimane il fatto che i valori ottenuti sono espressi in base 10; per ottenere dei valori con basi di numerazione differenti, occorre un'elaborazione successiva con altri programmi.

Alcune opzioni

-f formato | --format=formato 

Definisce esplicitamente il formato di rappresentazione dei valori restituiti. Il formato si esprime attraverso una stringa tra quelle elencate di seguito:

%g Notazione normale per i numeri piccoli e scientifica per i valori molto grandi.
%f Notazione normale con l'indicazione dei decimali.
%e Notazione scientifica.

-s stringa_di_separazione | --separator=stringa_di_separazione 

Definisce una stringa di separazione differente dal codice di interruzione di riga.

-w | --equal-width

Richiede espressamente di rappresentare i valori con lo stesso numero di cifre, con l'aggiunta eventuale di zeri anteriori.

Esempi

seq 9 0,5 11[Invio]

9
9,5
10
10,5
11

Negli esempi si mostra l'uso della virgola per separare la parte intera del numero, in base alla localizzazione italiana.

seq -f %e 9 0,5 11[Invio]

9,000000e+00
9,500000e+00
1,000000e+01
1,050000e+01
1,100000e+01

seq -w 9 0,5 11[Invio]

09,0
09,5
10,0
10,5
11,0

seq -s ' ' -w 9 0,5 11[Invio]

09,0 09,5 10,0 10,5 11,0

Come già accennato, per ottenere una sequenza espressa in una base di numerazione diversa, occorre l'aiuto di altri programmi. In generale, per queste cose si usa printf, come negli esempi seguenti:

seq 9 2 13[Invio]

9
11
13

printf %x'\n' `seq 9 2 13`[Invio]

9
b
d

printf %o'\n' `seq 9 2 13`[Invio]

11
13
15
Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org

1) GNU shell programming utilities   GNU GPL

2) GNU shell programming utilities   GNU GPL

3) GNU shell programming utilities   GNU GPL

4) GNU shell programming utilities   GNU GPL

5) GNU shell programming utilities   GNU GPL

6) GNU shell programming utilities   GNU GPL

7) GNU shell programming utilities   GNU GPL

8) Questo significa che l'espressione regolare deve corrispondere a partire dell'inizio della stringa.

9) GNU shell programming utilities   GNU GPL

10) GNU shell programming utilities   GNU GPL

11) GNU shell programming utilities   GNU GPL

12) GNU shell programming utilities   GNU GPL

13) GNU shell programming utilities   GNU GPL


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome programmi_di_servizio_diversi.html

[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico]