Crea una variabile timestamp nello script bash


375

Sto cercando di creare una variabile timestamp in uno script di shell per rendere un po 'più semplice la registrazione. Voglio creare la variabile all'inizio dello script e farla stampare l'ora corrente ogni volta che emetto echo $timestamp. Dimostrando di essere più difficile di quanto pensassi. Ecco alcune cose che ho provato:

timestamp="(date +"%T")" l'eco viene stampata (date +"%T")

timestamp="$(date +"%T")" echo stampa l'ora in cui la variabile è stata inizializzata.

Altre cose che ho provato sono solo lievi variazioni che non hanno funzionato meglio. Qualcuno sa come realizzare ciò che sto cercando di fare?

Risposte:


310

Per ottenere il timestamp corrente e non il momento in cui viene definita una variabile fissa, il trucco è usare una funzione e non una variabile:

#!/bin/bash

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

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

Se non ti piace il formato fornito dallo %Tspecificatore, puoi combinare gli altri identificatori di conversione dell'ora accettati da date. Per GNU date, puoi trovare l'elenco completo di questi specificatori nella documentazione ufficiale qui: https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers


26
A seconda di come si intende utilizzare questo, sarà ancora bisogno di usare la sostituzione di comando: echo "$(timestamp): something happened".
Chepner,

5
Per quanto riguarda la formattazione, ecco un set di formati più comuni: zxq9.com/archives/795
zxq9

175
Per me, volevo date +"%Y-%m-%d_%H-%M-%S"
Kimball Robinson il

3
per qualche motivo questo non mi ha dato il timestamp ma l'ora corrente con ":" nel mezzo.
erikbwork,

7
Penso che molte persone arrivino a questa domanda cercando un modo per generare un timestamp unix (come ho fatto io) e trovino la risposta di dchakarov più utile anche se questa risposta risponde meglio alla domanda del richiedente.
vastlysuperiorman,

565

Se vuoi ottenere un timestamp unix, devi usare:

timestamp=$(date +%s)

%Tti darà solo il tempo; lo stesso di %H:%M:%S(tramite http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ )


5
Ma questa variabile conterrà solo il valore del tempo in cui la variabile è stata avviata, giusto?
lindhe,

9
Immagino che questo stia ottenendo molti voti perché risponde al titolo della domanda, ma non sta rispondendo al corpo della domanda: D OP voleva ottenere un timestamp diverso ogni volta, mentre questo memorizzerà uno per l'intero script.
fedorqui 'SO smettere di danneggiare'

1
Sono venuto qui cercando esattamente questo. Vale a dire la stringa di formato corretta da cui ottenere un timestamp unix date. Tuttavia, ho anche annullato la risposta "corretta". Non stavo cercando quello, ma è una risposta migliore alla domanda originale ed è anche molto utile per me.
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
grazie, è quello che volevo: un timestamp come variabile da riutilizzare nella mia sceneggiatura! La sintassi della shell è così confusa.
Poutrathor,

2
+1 per l'aggiunta della parte in millisecondi. Questo echo $(date +"%Y-%m-%dT%T.%3N%z") Tuttavia non riesco a farlo funzionare in un terminale Mac. Come fare lo stesso su Mac. Grazie
kosgeinsky il

43

Il formato ISO 8601 ( 2018-12-23T12:34:56) è più leggibile del timestamp UNIX. Tuttavia su alcuni sistemi operativi non è possibile avere :nei nomi dei file. Pertanto raccomando invece di utilizzare qualcosa del genere:

2018-12-23_12-34-56

È possibile utilizzare il comando seguente per ottenere il timestamp in questo formato:

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

Questo è il formato che ho visto usare molte applicazioni. Un'altra cosa bella di questo è che se i nomi dei tuoi file iniziano con questo, puoi ordinarli in ordine alfabetico e sarebbero ordinati per data.


1
Grazie, è fantastico per la mia versione dei controlli di script
Andy,

1
TZ=UTC date +...può renderlo più portatile usando il timestamp UTC
MichaelChirico

17

Sto usando Ubuntu 14.04.

Il modo corretto nel mio sistema dovrebbe essere date +%s.

L'output di date +%Tè come 12:25:25.


15

Usa sostituzione comando:

timestamp=$( date +%T )

3
Questo è quello che ho già provato e stampa solo il momento in cui la variabile è stata inizializzata.
Dan

10
@ dan08: ecco come funzionano le variabili. Utilizzare una funzione se si desidera un output dinamico.
Choroba,

11

Puoi usare

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

Questo consegna nel formato 2014-02-01 15:12:35-05:00

I caratteri back-tick ( `) causeranno la valutazione di ciò che sta tra loro e includeranno il risultato nella riga. date --helpha altre opzioni.


1
Quanto a che ora arriva, questo dovrebbe essere eseguito immediatamente prima dell'inclusione nell'output dello schermo o in un file di registro destinato ad avere il tempo dell'output elencato.
Bill

2
questo è meno del formato ideale per un timestamp a causa dello spazio nell'output. Assicurati di citare "$ timestamp" in uso o otterrai due parametri al comando. ad esempio touch $timestampprodurrà due file.
harschware,

8

Le versioni recenti di bashnon richiedono la chiamata al programma esterno date:

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

%(...)Tutilizza l'argomento corrispondente come un timestamp UNIX e lo formatta in base al strftimeformato stile tra parentesi. Un argomento di -1corrisponde al tempo corrente e quando non si verificherebbe alcuna ambiguità può essere omesso.


5

E per i miei colleghi europei, provate ad usare questo:

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

fornirà un formato del formato: "15-02-2020_19-21-58"

Si chiama la variabile e si ottiene la rappresentazione della stringa in questo modo

$timestamp

1
Si prega di considerare l'utilizzo della notazione del codice per il proprio codice.
sabato

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

srand senza un valore utilizza il timestamp corrente con la maggior parte delle implementazioni Awk.


Mi piace questo, molto creativo!
TobiV,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.