Crear variable de marca de tiempo en el script bash


Estoy tratando de crear una variable de marca de tiempo en un script de shell para hacer el registro un poco más fácil. Quiero crear la variable al principio del script y hacer que imprima la hora actual cada vez que emita echo $timestamp. Es más difícil de lo que pensaba. He aquí algunas cosas que he intentado:

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

timestamp="$(date +"%T")" echo muestra la hora en que se inicializó la variable.

Otras cosas que he intentado son solo ligeras variaciones que no trabaja mejor. ¿Alguien sabe cómo lograr lo que estoy tratando de hacer?

Author: fedorqui, 2013-06-12

8 answers

Para obtener la marca de tiempo actual y no la hora de cuando se define una variable fija, el truco es usar una función y no una variable:

#!/bin/bash

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

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

Si no le gusta el formato dado por el especificador %T puede combinar los otros especificadores de conversión de tiempo aceptados por date. Para GNU date, puede encontrar la lista completa de estos especificadores en la documentación oficial aquí: https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers

 212
Author: giordano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-02 22:43:29

Si desea obtener la marca de tiempo unix, entonces necesita usar:

timestamp=$(date +%s)

%T te dará justo el tiempo; igual que %H:%M:%S (vía http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/)

 417
Author: dchakarov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-13 13:01:01
DATE=`date "+%Y%m%d"`

DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too
 30
Author: Girdhar Singh Rathore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-23 17:21:57

Use sustitución de órdenes:

timestamp=$( date +%T )
 12
Author: choroba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-12 13:06:11

Puede usar

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

Esto entrega en el formato 2014-02-01 15:12:35-05:00

Los caracteres back-tick (`) harán que lo que hay entre ellos se evalúe y tenga el resultado incluido en la línea. date --help tiene otras opciones.

 9
Author: Bill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-20 21:07:36

El formato ISO 8601 (2018-12-23T12:34:56) es más legible que la marca de tiempo UNIX. Sin embargo, en algunos OSs no se puede tener : en los nombres de archivo. Por lo tanto, recomiendo usar algo como esto en su lugar:

2018-12-23_12-34-56

Puede usar el siguiente comando para obtener la marca de tiempo en este formato:

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

Este es el formato que he visto usar en muchas aplicaciones. Otra cosa buena de esto es que si sus nombres de archivo comienzan con esto, puede ordenarlos alfabéticamente y se ordenarían por fecha.

 6
Author: Caner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-10 12:25:22

Estoy usando ubuntu 14.04.

La forma correcta en mi sistema debería ser date +%s.

La salida de date +%T es como 12:25:25.

 5
Author: Sean Lin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-27 04:26:33
timestamp=$(awk 'BEGIN {srand(); print srand()}')

Srand sin un valor utiliza la marca de tiempo actual con la mayoría de las implementaciones de Awk.

 1
Author: Steven Penny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-28 02:15:34