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?

Dan
fuente

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

giordano
fuente
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/ )

dchakarov
fuente
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
Girdhar Singh Rathore
fuente
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.

Caner
fuente
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.

Sean Lin
fuente
15

Usar sustitución de comando:

timestamp=$( date +%T )
choroba
fuente
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.

Cuenta
fuente
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.

chepner
fuente
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
Christoffer Nissen
fuente
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.

Steven Penny
fuente
¡Me gusta este, muy creativo!
TobiV