web-dev-qa-db-fra.com

Créer une variable d'horodatage dans le script bash

J'essaie de créer une variable d'horodatage dans un script Shell pour faciliter la journalisation. Je veux créer la variable au début du script et lui faire imprimer l'heure actuelle chaque fois que j'émets echo $timestamp. Cela s'avère être plus difficile que je ne le pensais. Voici quelques choses que j'ai essayées:

timestamp="(date +"%T")" echo imprime (date +"%T")

timestamp="$(date +"%T")" echo affiche l'heure à laquelle la variable a été initialisée.

D'autres choses que j'ai essayées ne sont que de légères variations qui n'ont pas fonctionné mieux. Est-ce que quelqu'un sait comment accomplir ce que j'essaye de faire?

322
Dan

Afin d’obtenir l’horodatage actuel et non l’heure à laquelle une variable fixe est définie, l’astuce consiste à utiliser une fonction et pas une variable:

#!/bin/bash

# Define a timestamp function
timestamp() {
  date +"%T"
}

# do something...
timestamp # print timestamp
# do something else...
timestamp # print another timestamp
# continue...

Si vous n'aimez pas le format donné par le spécificateur %T, vous pouvez combiner les autres spécificateurs de conversion de temps acceptés par date. Pour GNU date, vous pouvez trouver la liste complète de ces spécificateurs dans la documentation officielle ici: https://www.gnu.org/software/coreutils/manual/html_node /Time-conversion-specifiers.html#Time-conversion-specifiers

261
giordano

Si vous voulez obtenir un timestamp Unix, vous devez utiliser:

timestamp=$(date +%s)

%T vous donnera juste le temps; identique à %H:%M:%S (via http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ )

505
dchakarov
DATE=`date "+%Y%m%d"`

DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too
48

Le format ISO 8601 (2018-12-23T12:34:56) est plus lisible que l'horodatage UNIX. Cependant, sur certains systèmes d’exploitation, vous ne pouvez pas avoir : dans les noms de fichiers. Par conséquent, je recommande d'utiliser quelque chose comme ceci à la place:

2018-12-23_12-34-56

Vous pouvez utiliser la commande suivante pour obtenir l'horodatage dans ce format:

date +%Y-%m-%d_%H-%M-%S

C'est le format que j'ai vu utiliser de nombreuses applications. Une autre bonne chose à ce sujet est que si vos noms de fichiers commencent par ceci, vous pouvez les trier par ordre alphabétique et ils seront triés par date.

26
Caner

Utilisez la substitution de commande:

timestamp=$( date +%T )
15
choroba

J'utilise Ubuntu 14.04.

La manière correcte dans mon système devrait être date +%s.

La sortie de date +%T ressemble à 12:25:25.

12
Sean Lin

Vous pouvez utiliser

timestamp=`date --rfc-3339=seconds`

Ceci livre au format 2014-02-01 15:12:35-05:00

Les caractères de retour en arrière (`) entraîneront l'évaluation de ce qui les sépare et le résultat sera inclus dans la ligne. date --help a d'autres options.

9
Bill

Les versions récentes de bash ne nécessitent pas d’appel au programme externe date:

printf -v timestamp '%(%T)T'

%(...)T utilise l'argument correspondant comme horodatage UNIX et le formate selon le format de style strftime- entre les parenthèses. Un argument de -1 correspond à l'heure actuelle et il est possible d'omettre toute ambiguïté.

3
chepner
timestamp=$(awk 'BEGIN {srand(); print srand()}')

srand sans valeur utilise l'horodatage actuel avec la plupart des implémentations d'Awk.

1
Steven Penny