[successivo] [precedente] [inizio] [fine] [indice generale] [violazione licenza] [translators] [docinfo] [indice analitico] [volume] [parte]
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 98.1 elenca i programmi a cui si accenna in questo capitolo.
Tabella 98.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. |
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.
Il programma di servizio echo (1) emette le stringhe indicate come argomento, separate da uno spazio e con l'aggiunta di un codice di interruzione di riga finale:
|
|
Il programma riconosce alcune sequenze di escape che possono essere utili per formattare il testo da visualizzare. Queste sono elencate nella tabella 98.2.
Tabella 98.2. Elenco delle sequenze di escape riconosciute da echo.
| Codice | Descrizione |
|
| Inserisce la barra obliqua inversa (\). |
|
| Inserisce il codice <BEL> (avvisatore acustico). |
|
| Inserisce il codice <BS> (backspace). |
|
| Alla fine di una stringa previene l'inserimento di una nuova riga. |
|
| Inserisce il codice <FF> (formfeed). |
|
| Inserisce il codice <LF> (linefeed). |
|
| Inserisce il codice <CR> (carriage return). |
|
| Inserisce una tabulazione normale (<HT>). |
|
| Inserisce una tabulazione verticale (<VT>). |
|
| Inserisce il carattere corrispondente al codice ottale n. |
Tabella 98.3. Alcune opzioni.
| Opzione | Descrizione |
|
| Sopprime il codice di interruzione di riga finale, in modo da permettere l'emissione successiva sulla stessa riga. |
|
| Abilita l'interpretazione delle sequenze di escape descritte nella tabella 98.2. |
Il programma di servizio printf (2) emette attraverso lo standard output la stringa di formattazione fornita, utilizzando gli argomenti, con le stesse regole della funzione printf del linguaggio C:
|
|
Tabella 98.4. Variabili di formattazione particolari.
| Stringa | Descrizione |
|
| Numero ottale composto da una a tre cifre, ognuna con valori compresi tra zero e sette. |
|
| Numero esadecimale composto da una a tre cifre, ognuna con valori compresi tra zero e la lettera «f». |
Il programma di servizio 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. Segue la descrizione di alcuni 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[Invio]
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».
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).
Il programma di servizio false (4) si limita a restituire il valore uno, corrispondente in pratica a Falso nell'ambito dei comandi di shell:
|
|
Il programma di servizio true (5) si limita a restituire il valore zero, corrispondente in pratica a Vero nell'ambito dei comandi di shell:
|
|
Il programma di servizio test (6) 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.
|
|
|
|
Come si può osservare dai modelli mostrati, si può usare questo programma anche con il nome [, ovvero una parentesi quadra aperta, ma in tal caso, alla fine dell'espressione deve apparire un'altra parentesi quadra chiusa. Questo strattagemma consente di scrivere consente di valutare delle espressioni con una notazione simile a quella di un linguaggio di programmazione comune.
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.
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 98.5 e in quelle successive, vengono elencate le espressioni elementari che possono essere utilizzate in questo modo.
Tabella 98.5. Espressioni per la verifica del tipo di file.
Tabella 98.6. Espressioni per la verifica dei permessi e delle modalità dei file.
Tabella 98.7. Espressioni per la verifica di altre caratteristiche dei file.
Tabella 98.8. Espressioni per la verifica e la comparazione delle stringhe.
| Espressione | Descrizione |
|
| Vero se la lunghezza della stringa è zero. |
|
| Vero se la lunghezza della stringa è diversa da zero. |
|
| Vero se le stringhe sono uguali. |
|
| Vero se le stringhe sono diverse. |
|
| Vero se la prima stringa è lessicograficamente precedente. |
|
| Vero se la prima stringa è lessicograficamente successiva. |
Tabella 98.9. 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 |
|
| Vero se gli operandi sono uguali. |
|
| Vero se gli operandi sono differenti. |
|
| Vero se il primo operando è inferiore al secondo. |
|
| Vero se il primo operando è inferiore o uguale al secondo. |
|
| Vero se il primo operando è maggiore del secondo. |
|
| Vero se il primo operando è maggiore o uguale al secondo. |
Tabella 98.10. Operatori logici.
| Espressione | Descrizione |
|
| Inverte il risultato logico dell'espressione. |
|
| Vero se entrambe le espressioni danno un risultato Vero. |
|
| Vero se almeno un'espressione dà un risultato Vero. |
Seguono due esempi senza descrizione, mostrando il risultato ottenuto attraverso lo standard output:
$ test 1 -lt 2 && echo "ok"[Invio]
ok |
$ [ "prova" = "pro" ] || echo "le stringhe non combaciano"[Invio]
le stringhe non combaciano |
$ test -d /bin && echo "/bin è una directory"[Invio]
/bin è una directory |
$ [ -e /bin/sh && ] echo "/bin/sh è un file eseguibile"[Invio]
/bin/sh è un file eseguibile |
Il programma di servizio 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.
Il valore restituito da expr dipende essenzialmente dal risultato dell'espressione nel modo seguente:
| Valore di uscita | Quando si ottiene |
| 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. |
|
Non si deve confondere il valore restituito dal programma con il risultato delle espressioni: expr valuta le espressioni come farebbe un linguaggio di programmazione comune, attribuendo al valore uno il significato di Vero e a zero il valore Falso. |
Le espressioni possono essere concatenate attraverso degli operatori logici, come descritto nella tabella successiva.
Tabella 98.12. Operatori logici.
| Operatore | Descrizione |
|
| È 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. |
Gli operatori di comparazione sono i soliti che si usano in matematica, come descritto nella tabella successiva.
Tabella 98.13. Operatori di comparazione.
| Operatore | Descrizione |
|
| 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.
Gli operatori numerici sono i soliti che si usano in matematica, come descritto nella tabella successiva.
Tabella 98.14. Espressioni numeriche.
| Operatore | Descrizione |
|
| Addizione. |
|
| Sottrazione. |
|
| Moltiplicazione. |
|
| Divisione. |
|
| Resto o modulo. |
Tabella 98.15. Espressioni su stringhe.
Segue la descrizione di alcuni 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.
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.
Il programma di servizio tee (8) 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.
|
|
Tabella 98.16. Alcune opzioni.
| Opzione | Descrizione |
|
| Aggiunge i dati ai file di destinazione, accodandoli, invece di sovrascriverli. |
|
| Ignora i segnali di interruzione. |
Alcuni programmi si occupano di mostrare o modificare il contesto in cui si opera.
Il programma di servizio printenv (9) 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.
Tabella 98.17. Valore di uscita.
| Valore di uscita | Condizione |
| 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. |
L'esempio seguente mostra il contenuto della variabile PATH:
$ printenv PATH[Invio]
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.
Il programma di servizio sleep (10) attende per il tempo indicato come argomento, quindi termina la sua esecuzione. La durata si esprime attraverso un numero seguito, eventualmente, da una lettera che ne definisce l'unità di misura.
|
|
Se viene indicato soltanto un numero, si intende che si tratti di secondi; altrimenti, la lettera «s» indica esplicitamente una quantità di secondi, la lettera «m» indica una quantità di minuti, la lettera «h» indica ore e la lettera «d» indica giorni.
A seconda della realizzazione del programma, potrebbe essere consentito l'uso di numeri non interi, ma in generale, per ottenere la compatibilità massima, è meglio limitarsi all'uso di numeri interi.
Segue la descrizione di alcuni esempi.
$ sleep 10[Invio]
Attende 10 secondi e quindi termina la sua esecuzione.
$ sleep 10s[Invio]
Attende 10 secondi e quindi termina la sua esecuzione.
$ sleep 5m[Invio]
Attende cinque minuti e quindi termina la sua esecuzione.
Benché esistano dei programmi specifici per le elaborazioni matematiche, come BC (parte lxiii), alle volte dei programmi di servizio più semplici possono essere ugualmente utili.
Il programma di servizio factor (11) consente di calcolare i fattori di un numero, ovvero la serie di numeri primi, moltiplicando i quali si ottiene il numero di partenza.
|
|
Si osservi l'esempio seguente:
$ factor 12345[Invio]
12345: 3 5 823 |
Il comando restituisce un messaggio con il quale si comprende che si ottiene 12 345 moltiplicando i numeri primi 3, 5 e 823.
Il programma di servizio seq (12) 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, l'esempio seguente restituisce attraverso lo standard output la sequenza dei numeri interi da uno a quattro:
$ seq 1 1 4[Invio]
1 2 3 4 |
La stessa cosa si ottiene con i due esempi seguenti, perché il passo e il valore iniziale sono quelli predefiniti:
$ seq 1 4[Invio]
$ seq 4[Invio]
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.
Tabella 98.18. Alcune opzioni.
Segue la descrizione di alcuni esempi. Si osservi che in questi si mostra l'uso della virgola per separare la parte intera del numero, in base alla localizzazione italiana.
$ seq 9 0,5 11[Invio]
9 9,5 10 10,5 11 |
$ 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, come negli esempi successivi, dove si usa printf per rielaborare il risultato emesso da seq (il primo esempio serve a mostrare cosa si otterrebbe direttamente da seq).
$ 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 2004.10.10 --- Copyright © 2000-2004 Daniele Giacomini -- <daniele (ad) swlibero·org>, <daniele·giacomini (ad) poste·it>
1) GNU core utilities GNU GPL
2) GNU core utilities GNU GPL
3) GNU core utilities GNU GPL
4) GNU core utilities GNU GPL
5) GNU core utilities GNU GPL
6) GNU core utilities GNU GPL
7) GNU core utilities GNU GPL
8) GNU core utilities GNU GPL
9) GNU core utilities GNU GPL
10) GNU core utilities GNU GPL
11) GNU core utilities GNU GPL
12) GNU core 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 licenza] [translators] [docinfo] [indice analitico]