Guida avanzata di scripting Bash: Un'approfondita esplorazione dell'arte dello scripting di shell | ||
---|---|---|
Indietro | Capitolo 15. Filtri, programmi e comandi esterni | Avanti |
La semplice invocazione di date visualizza la data e l'ora allo stdout. L'interesse per questo comando deriva dall'uso delle sue opzioni di formato e verifica.
Esempio 15-10. Utilizzo di date
#!/bin/bash # Esercitarsi con il comando 'date' echo "Il numero di giorni trascorsi dall'inizio dell'anno è `date +%j`." # È necessario il '+' per il formato dell'output. # %j fornisce i giorni dall'inizio dell'anno. echo "Il numero di secondi trascorsi dal 01/01/1970 è `date +%s`." # %s contiene il numero di secondi dall'inizio della "UNIX epoch", ma #+ quanto può essere utile? prefisso=temp suffisso=$(date +%s) # L'opzione "+%s" di 'date' è una specifica GNU. nomefile=$prefisso.$suffisso echo $nomefile # È importantissima per creare nomi di file temporanei "univoci", è persino #+ migliore dell'uso di $$. # Leggete la pagina di manuale di 'date' per le altre opzioni di formato. exit 0 |
L'opzione -u
fornisce il tempo UTC
(Universal Coordinated Time).
bash$ date dom mag 11 17:55:55 CEST 2003 bash$ date -u dom mag 11 15:56:08 UTC 2003 |
Il comando date possiede un certo numero di
opzioni. Per esempio %N
visualizza la parte di
nanosecondi dell'ora corrente. Un uso interessante è quello
per generare interi casuali di sei cifre.
date +%N | sed -e 's/000$//' -e 's/^0//' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Toglie gli zeri iniziali e finali, se presenti. |
Esistono molte altre opzioni (eseguite man date).
date +%j # Visualizza i giorni dell'anno (i giorni trascorsi dal 1 gennaio). date +%k%M # Visualizza l'ora e i minuti nel formato 24-ore, come unica stringa di cifre. # Il parametro 'TZ' consente di ottenere il tempo di una zona diversa da #+ quella di default. date # Mon Mar 28 21:42:16 MST 2005 TZ=EST date # Mon Mar 28 23:42:16 EST 2005 # Grazie a Frank Kannemann e Pete Sjoberg, per il suggerimento. SeiGiorniFa=$(date --date='6 days ago') UnMeseFa=$(date --date='1 month ago') # Quattro settimane (non un mese). UnAnnoFa=$(date --date='1 year ago') |
Vedi anche Esempio 3-4.
Controllo dell'ora di zona: visualizza l'ora di una zona specificata.
bash$ zdump EST EST Sun May 11 11:01:53 2003 EST |
Fornisce statistiche molto dettagliate sul tempo di esecuzione di un comando.
time ls -l / visualizza qualcosa di simile:
0.00user 0.01system 0:00.05elapsed 16%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (149major+27minor)pagefaults 0swaps |
Si veda anche il comando, molto simile, times nella sezione precedente.
Dalla versione 2.0 di Bash, time è diventata una parola riservata di shell, con un comportamento leggermente diverso se usato con una pipe. |
Utility per aggiornare all'ora corrente di sistema, o ad altra ora specificata, l'ora di accesso/modifica di un file. Viene usata anche per creare un nuovo file. Il comando touch zzz crea un nuovo file vuoto, di nome zzz, nell'ipotesi che zzz non sia già esistente. Creare file vuoti, che riportano l'ora e la data della loro creazione, può rappresentare un utile sistema per la registrazione del tempo, per esempio per tener traccia delle successive modifiche di un progetto.
Il comando touch equivale a : >> nuovofile o a >> nuovofile (per i file regolari). |
Prima dell'esecuzione di cp -u (copy/update), si dovrebbe usare touch per aggiornare data/ora dei file che non si vuole siano sovrascritti. Ad esempio, se la directory /home/bozo/tax_audit contenesse i file spreadsheet-051606.data, spreadsheet-051706.data e spreadsheet-051806.data, allora l'esecuzione di touch spreadsheet*.data proteggerebbe questi file dall'essere sovrascritti da file aventi lo stesso nome durante l'esecuzione di cp -u /home/bozo/financial_info/spreadsheet*data /home/bozo/tax_audit. |
Il comando di controllo di job at esegue una data serie di comandi ad un'ora determinata. Ad uno sguardo superficiale, assomiglia a cron. Tuttavia, at viene utilizzato principalmente per eseguire la serie di comandi una sola volta.
at 2pm January 15 visualizza un prompt per l'inserimento della serie di comandi da eseguire a quella data e ora. I comandi dovrebbero essere shell-script compatibili poiché, per questioni pratiche, l'utente sta digitando una riga alla volta in uno script di shell eseguibile. L'input deve terminare con un Ctl-D.
Con l'uso dell'opzione -f
o della
redirezione dell'input (<),
at può leggere l'elenco dei
comandi da un file. Questo file è uno script di
shell eseguibile e, naturalmente, non dovrebbe essere
interattivo. Risulta particolarmente intelligente inserire
il comando run-parts nel
file per eseguire una diversa serie di script.
bash$ at 2:30 am Friday < at-elenco-job job 2 at 2000-10-27 02:30 |
Il comando di controllo di job batch è
simile ad at, ma esegue l'elenco dei comandi
quando il carico di sistema cade sotto 0.8. Come
at, può leggere, con l'opzione
-f
, i comandi da un file.
Visualizza allo stdout un calendario mensile in un formato molto elegante. Può fare riferimento all'anno corrente o ad un ampio intervallo di anni passati e futuri.
È l'equivalente shell di un ciclo wait. Sospende l'esecuzione per il numero di secondi indicato. È utile per la temporizzazione o per i processi in esecuzione in background che hanno il compito di verificare in continuazione il verificarsi di uno specifico evento (polling), come in Esempio 29-6.
sleep 3 # Pausa di 3 secondi. |
Il comando sleep conta, in modo predefinito, i secondi. Possono però essere specificati minuti, ore o giorni.
|
Per l'esecuzione di comandi da effettuarsi ad intervalli determinati, il comando watch può rivelarsi una scelta migliore di sleep. |
Microsleep (la u deve interpretarsi come la lettera dell'alfabeto greco mu, usata come prefisso per micro). È uguale a sleep, visto prima, ma "sospende" per intervalli di microsecondi. Può essere impiegato per una temporizzazione più accurata o per la verifica, ad intervalli di frequenza elevati, di un processo in esecuzione.
usleep 30 # Pausa di 30 microsecondi. |
Questo comando fa parte del pacchetto Red Hat initscripts / rc-scripts.
Il comando usleep non esegue una temporizzazione particolarmente precisa e, quindi, non può essere impiegato per calcolare il tempo di cicli critici. |
Il comando hwclock dà accesso e permette di regolare l'orologio hardware della macchina. Alcune opzioni richiedono i privilegi di root. Il file di avvio /etc/rc.d/rc.sysinit usa hwclock per impostare, in fase di boot, l'ora di sistema dall'orologio hardware.
Il comando clock è il sinonimo di hwclock.