Crear variable de marca de tiempo en script bash


375

Estoy tratando de crear una variable de marca de tiempo en un script de shell para facilitar un poco el registro. Quiero crear la variable al comienzo del script y hacer que imprima la hora actual cada vez que emito echo $timestamp. Está resultando ser más difícil de lo que pensaba. Aquí hay algunas cosas que he probado:

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

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

Otras cosas que he probado son solo pequeñas variaciones que no funcionaron mejor. ¿Alguien sabe cómo lograr lo que estoy tratando de hacer?

Respuestas:


310

Para obtener la marca de tiempo actual y no el momento en que se define una variable fija, el truco consiste en utilizar 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 %Tespecificador, 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


26
Dependiendo de cómo se va a utilizar esto, usted todavía tendrá que utilizar la sustitución de comandos: echo "$(timestamp): something happened".
chepner

55
En cuanto al formato, aquí hay un conjunto de formatos más comunes: zxq9.com/archives/795
zxq9

175
Para mí, quería date +"%Y-%m-%d_%H-%M-%S"
Kimball Robinson el

3
por alguna razón, esto no me dio la marca de tiempo sino la hora actual con ":" en el medio.
erikbwork

77
Creo que muchas personas llegan a esta pregunta en busca de una forma de generar una marca de tiempo de Unix (como yo lo he hecho) y encuentran que la respuesta de dchakarov es más útil a pesar de que esta respuesta aborda mejor la pregunta del autor de la pregunta.
vastlysuperiorman

565

Si desea obtener la marca de tiempo de Unix, debe usar:

timestamp=$(date +%s)

%Tte dará el tiempo justo; igual que %H:%M:%S(a través de http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ )


55
Pero esta variable solo contendrá el valor del tiempo cuando se inició la variable, ¿estoy en lo cierto?
lindhe

99
Supongo que esto está recibiendo muchos votos positivos porque responde al título de la pregunta, pero no responde al cuerpo de la pregunta: D OP quería obtener una marca de tiempo diferente cada vez, mientras que esto almacenará uno para todo el guión.
fedorqui 'DEJA de dañar'

1
Vine aquí buscando esto exactamente. Es decir, la cadena de formato adecuada para obtener una marca de tiempo de Unix date. Sin embargo, también voté por la respuesta "correcta". No estaba buscando eso, pero es una mejor respuesta a la pregunta original y también es muy útil para mí.
vastlysuperiorman

69
DATE=`date "+%Y%m%d"`

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

1
gracias, eso es lo que quería: ¡una marca de tiempo como variable para reutilizar en mi script! La sintaxis de shell es muy confusa.
Poutrathor

2
+1 para agregar la parte de milisegundos. echo $(date +"%Y-%m-%dT%T.%3N%z") Sin embargo, esto no puedo hacer que funcione en un terminal Mac. Cómo hacer lo mismo en Mac. Gracias
kosgeinsky

43

El formato ISO 8601 ( 2018-12-23T12:34:56) es más legible que la marca de tiempo UNIX. Sin embargo, en algunos sistemas operativos no 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:

TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`

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


1
Gracias, esto es genial para mi script de controles de versión
Andy

1
TZ=UTC date +...puede hacer que esto sea más portátil usando la marca de tiempo UTC
MichaelChirico

17

Estoy usando ubuntu 14.04.

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

La salida de date +%Tes como 12:25:25.


15

Usar sustitución de comando:

timestamp=$( date +%T )

3
Esto es lo que ya probé y solo imprime el momento en que se inicializó la variable.
Dan

10
@ dan08: Así funcionan las variables. Use una función si desea una salida dinámica.
choroba

11

Puedes usar

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

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

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


1
En cuanto a la hora, se debe ejecutar inmediatamente antes de incluirlo en la salida de la pantalla o en un archivo de registro destinado a tener la hora de la salida en la lista.
Bill

2
este formato no es el ideal para una marca de tiempo debido al espacio en la salida. Asegúrese de citarlo "$ timestamp" en uso o obtendrá dos parámetros para el comando. por ejemplo touch $timestamp, producirá dos archivos.
harschware

8

Las versiones recientes de bashno requieren una llamada al programa externo date:

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

%(...)Tutiliza el argumento correspondiente como marca de tiempo UNIX y lo formatea de acuerdo con el strftimeformato de estilo entre paréntesis. Un argumento de -1corresponde a la hora actual, y cuando no se produciría ninguna ambigüedad se puede omitir.


5

Y para mis compañeros europeos, intente usar esto:

timestamp=$(date +%d-%m-%Y_%H-%M-%S)

dará un formato del formato: "15-02-2020_19-21-58"

Llama a la variable y obtiene la representación de cadena como esta

$timestamp

1
Considere usar la notación de código para su código.
Sao

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

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


¡Me gusta este, muy creativo!
TobiV
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.