XXX Comandes de data i hora¶
En aquesta secció estudiarem les comandes time, date i el càlcul de temps.
- date
- Invocant-la directament, date escriu la data i l’hora a la
sortida estàndard (
stdout
). Aquesta comanda es torna més interessant quan es fan servir les opcions de formatat i anàlisi.
Exemple 10. Ús de date¶
#!/bin/bash # Ús de la comanda 'date' echo "El nombre de dies des de l'inici de l'any és `date +%j`." # Cal un '+' per invocar el formatat. # %j retorna el dia de l'any. echo "El nombre de segons que ha passat des de 01/01/1970 és `date +%s`." # %s genera el nombre de segons des de que va començar l' "UNIX epoch", #+ Però, de què ens pot servir això? prefix=temp suffix=$(date +%s) # L'opció "+%s" de 'date' és específica de GNU. filename=$prefix.$suffix echo "Nom de fitxer temporal = $filename" # És perfecte per crear fitxers temporals amb noms "únics i aleatoris", #+ fins i tot millor que fer servir $$. # Llegiu la pàgina man de 'date' per a conèixer més opcions de formatat. exit 0L’opció
-u
retorna l’ UTC o Temps Universal Coordinat (Universal Coordinated Time).bash$ date Fri Mar 29 21:07:39 MST 2002 bash$ date -u Sat Mar 30 04:07:42 UTC 2002Aquesta opció facilita el càlcul del temps entre diferents dates.
Exemple 11. Càlculs amb Date¶
#!/bin/bash # date-calc.sh # Autor: Nathan Coulter MPHR=60 # Minuts per hora. HPD=24 # Hores per dia. diff () { printf '%s' $(( $(date -u -d"$TARGET" +%s) - $(date -u -d"$CURRENT" +%s))) # %d = dia del mes } CURRENT=$(date -u -d '2007-09-01 17:30:24' '+%F %T.%N %Z') TARGET=$(date -u -d'2007-12-25 12:30:00' '+%F %T.%N %Z') # %F = data completa, %T = %H:%M:%S, %N = nanosegons, %Z = zona horària. printf '\nEl %s de 2007 ' \ "$(date -d"$CURRENT + $(( $(diff) /$MPHR /$MPHR /$HPD / 2 )) days" '+%d %B')" # %B = nom del mes ^ mig camí printf 'estava a mig camí entre %s ' "$(date -d"$CURRENT" '+%d %B')" printf 'i %s\n' "$(date -d"$TARGET" '+%d %B')" printf '\nEl %s a les %s hi quedaven\n' \ $(date -u -d"$CURRENT" +%F) $(date -u -d"$CURRENT" +%T) DAYS=$(( $(diff) / $MPHR / $MPHR / $HPD )) CURRENT=$(date -d"$CURRENT +$DAYS days" '+%F %T.%N %Z') HOURS=$(( $(diff) / $MPHR / $MPHR )) CURRENT=$(date -d"$CURRENT +$HOURS hours" '+%F %T.%N %Z') MINUTES=$(( $(diff) / $MPHR )) CURRENT=$(date -d"$CURRENT +$MINUTES minutes" '+%F %T.%N %Z') printf '%s dies, %s hores, ' "$DAYS" "$HOURS" printf '%s minuts, i %s segons ' "$MINUTES" "$(diff)" printf 'fins el dinar de Nadal!\n\n' # Exercici: # -------- # Reescriu la funció diff () de manera que accepti paràmetres en comptes de variables globals. #+ NdT. Realitza els canvis que calguin per mostrar l'article davant els noms dels mesos.La comanda date disposa d’un bon nombre d’opcions de sortida (output). Per exemple
%N
retorna la part dels nanosegons del temps actual. Això pot ser útil, per exemple, per generar d’enters aleatoris.date +%Nsed -e 's/000$//' -e 's/^0//' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Elimina els zeros que hi puguin haver a l'inici i al final. # La longitud de l'enter generat depèn de #+ quants zeros s'hagin eliminat., # 115281032 # 63408725 # 394504284Hi ha moltes altres opcions (mira man date).
date +%j # Mostra el dia de l'any (dies que han passat des del 1 de gener). date +%k%M # Mostra l'hora i el minut en format 24-hores en un únic string. # El paràmetre 'TZ' permet reemplaçar la zona horària per defecte. date # Mon Mar 28 21:42:16 MST 2005 TZ=EST date # Mon Mar 28 23:42:16 EST 2005 FaSisDies=$(date --date='6 days ago') FaUnMes=$(date --date='1 month ago') # Quatre setmanes abans (no un mes!) FaUnAny=$(date --date='1 year ago')Mira també l’ Exemple 3-4 i Exemple A-43.
- zdump
Mostra el temps en la zona horària que se li especifiqui.
bash$ zdump EST EST Tue Sep 18 22:09:22 2001 EST
- time
Mostra estadístiques detallades de temps de l’execució d’una comanda.
time ls -l /
retorna quelcom similar a:real 0m0.067s user 0m0.004s sys 0m0.005s
Mira també a la secció anterior la comanda (molt semblant) times.
Atenció: Des de la versió 2.0 de Bash, time és una paraula reservada. Presenta un comportament lleugerament diferent amb pipelines.
- touch
Utilitat que modifica els temps de darrera modificació i accés d’un fitxer al temps del sistema o bé a un d’especificat. També és útil per a crear un nou fitxer. La comanda
touch zzz
crea un nou fitxer de longitud zero, amb el nomzzz
sempre, és clar, que no existeixi jazzz
. És útil deixar marques de temps d’aquesta manera en fitxers buits de manera que es pugui fer seguiment dels moments de modificació d’un projecte.Atenció: La comanda touch equival a
: >> newfile
o>> newfile
(en el cas de fitxers ordinaris).Truc: Abans de fer cp -u (copia / actualitza), fes servir touch per a actualitzar la marca de temps d’aquells fitxers que no vulguis sobreescriure.
Per exemple, si el directori
/home/bozo/tax_audit
conté els fitxerscalculs-051606.data
,calculs-051706.data
, icalculs-051806.data
, llavors fent un touch calculs*.data protegirà aquests fitxers de ser sobreescrits per fitxers amb el mateix nom durant l’execució de cp -u /home/bozo/financial_info/calculs*data /home/bozo/tax_audit.- at
La comanda de control de treballs at executa un conjunt de comandes donat en el moment especificat. Recorda al cron però at és realment útil quan volem executar un únic cop un conjunt de comandes.
at 2pm January 15
demana per un conjunt de comandes a ser executades en el moment indicat. Aquestes comandes han de ser compatibles amb shell-script donat que, a efectes pràctics, l’usuari està escrivint un script de shell línia a línia. L’entrada finalitza amb Ctl-D.at llegeix la llista de comandes des d’un fitxer tant indicant l’opció
-f
com redireccionant l’entrada (<), El fitxer contindrà un shell script tot qualsevol, per suposat sempre i quant no sigui interactiu. Resulta particularment adequat incloure la comanda run-parts al fitxer per a executar un conjunt diferent de scripts.bash$ at 2:30 am Friday < at-jobs.list job 2 at 2000-10-27 02:30
- batch
La comanda de control de treballs batch és similar a at, Es diferencia del segon en que executa la llista de comandes quan la càrrega del sistema cau per sota de
.8
. Al igual que at, pot llegir comandes d’un fitxer amb l’opció-f
.El concepte de processament en segon pla o batch processing data de l’era de les computadores mainframe. Vol dir, executar un conjunt de comandes sense intervenció de l’usuari.
- cal
- Mostra un calendari ben formatat per sortida estàndard (
stdout
). Funciona tant per l’any actual com per un ampli rang d’anys al passat i al futur, - sleep
És l’equivalent per la shell d’un bucle d’espera. Es queda en pausa durant el nombre especificat de segons sense fer res. Pot ser útil per calcular temps i també en processos que s’executen en segon pla comprovant un esdeveniment amb certa freqüència (polling), com ara a l’Exemple 31-6.
sleep 3 # Pausa 3 segons.
Atenció: Per defecte la comanda sleep funciona amb segons, però es pot especificar també minuts, hores o dies.
sleep 3 h # Pausa 3 hores!
Atenció: La comanda watch pot ser una millor elecció que sleep quan el que volem és executar comandes cada cert interval de temps.
- usleep
Microsleep (la u es llegeix com la lletra grega mu, o el prefix micro-). És el mateix que sleep, però amb intervals de microsegons. Pot ser usada per càlcul de temps amb precisió, o bé per controlar un procés amb un interval molt freqüent.
usleep 30 # Pausa 30 microsegons.
Aquesta comanda és part dels paquet de Red Hat initscripts / rc-scripts.
Compte!: La comanda usleep no ofereix un càlcul de temps particularment precís i , per tant, no és adequada per a bucles on el temps sigui crític.
- hwclock, clock
La comanda hwclock accedeix o ajusta el rellotge físic de la màquina. Algunes opcions requereixen privilegis de root. El fitxer d’inici
/etc/rc.d/rc.sysinit
fa servir hwclock per a assignar durant l’arrancada l’hora del sistema a partir del rellotge de la màquina.La comanda clock s’anomena també hwclock.
Inici : Guia avançada de Bash-Scripting
Amunt : Capítol 16. Filtres externs, programes i comandes
Anterior : Comandes complexes
Següent : Comandes de processament de text