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 59.1 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 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.
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.
|
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 più avanti.
\a
avvisatore acustico;
\b
backspace; o <BS>;
\c
eliminazione del codice di interruzione di riga finale;
\f
form feed o <FF>;
\n
line feed o <LF>;
\r
carriage return o <CR>;
\t
tabulazione (orizzontale) o <HT>;
\v
tabulazione verticale;
\\
barra obliqua inversa;
\nnn
il carattere il cui codice ottale corrisponde al numero indicato da nnn.
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.
\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 [<stringa>...] |
yes
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.
$
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
.
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
è un programma banale che restituisce semplicemente il valore 1, corrispondente in pratica a Falso nell'ambito dei comandi di shell.
true |
true
è un programma banale che restituisce semplicemente il valore 0, corrispondente in pratica a Vero nell'ambito dei comandi di shell.
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.
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 59.2, e successive, vengono elencate le espressioni elementari che possono essere utilizzate in questo modo.
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. |
- 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. |
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 all'UID efficace dell'utente attuale. |
- G <file> | Vero se il file esiste e appartiene al GID efficace dell'utente attuale. |
Espressione | Descrizione |
- s <file> | Vero se il file esiste e ha una dimensione maggiore di zero. |
<file1> - nt <file2> | Vero se il primo file ha la data di modifica più recente. |
<file1> - ot <file2> | Vero se il primo file ha la data di modifica più vecchia. |
<file1> - et <file2> | Vero se i due nomi corrispondono allo stesso inode. |
Espressione | Descrizione |
- 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. |
<stringa1> < <stringa2> | Vero se la prima stringa è lessicograficamente precedente. |
<stringa1> > <stringa2> | Vero se la prima stringa è lessicograficamente successiva. |
Espressione | Descrizione |
<op1> - eq <op2> | Vero se gli operandi sono uguali. |
<op1> - ne <op2> | Vero se gli operandi sono differenti. |
<op1> - lt <op2> | Vero se il primo operando è inferiore al secondo. |
<op1> - le <op2> | Vero se il primo operando è inferiore o uguale al secondo. |
<op1> - gt <op2> | Vero se il primo operando è maggiore del secondo. |
<op1> - ge <op2> | Vero se il primo operando è maggiore o uguale al secondo. |
-
l <stringa>
che restituisce la lunghezza della stringa indicata.
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. |
$
test 1
[Invio]-
gt 2 && echo "ok"
ok |
$
test
[Invio]-
d /bin && echo "/bin è una directory"
/bin è una directory |
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.
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.
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.
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 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.
Gli operatori numerici sono i soliti che si usano in matematica:
+ addizione;
-
sottrazione;
* moltiplicazione;
/ divisione;
% resto o modulo.
<stringa> : <espressione-regolare> |
L'operatore :
viene usato per comparare una stringa con un'espressione regolare. Questa espressione regolare può essere solo di tipo elementare e si considera che contenga implicitamente un accento circonflesso (^
) iniziale.
*1*
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.
$
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.
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.
|
Aggiunge (append) i dati ai file di destinazione invece di sovrascriverli.
|
Ignora i segnali di interruzione.
Alcuni programmi si occupano di mostrare o modificare il contesto in cui si opera.
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.
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.
$
printenv PATH
Mostra il contenuto della variabile PATH
.
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.
sleep <durata> |
sleep
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.
s
secondi
m
minuti
h
ore
d
giorni
$
sleep 10s
Attende 10 secondi e quindi termina la sua esecuzione.
$
sleep 5m
Attende 5 minuti e quindi termina la sua esecuzione.
---------------------------
Appunti Linux 1999.09.21 --- Copyright © 1997-1999 Daniele Giacomini -- daniele @ pluto.linux.it
1.) Questo significa che l'espressione regolare deve corrispondere a partire dell'inizio della stringa.