Erstellen Sie eine Zeitstempelvariable im Bash-Skript

375

Ich versuche, eine Zeitstempelvariable in einem Shell-Skript zu erstellen, um die Protokollierung ein wenig zu vereinfachen. Ich möchte die Variable am Anfang des Skripts erstellen und sie bei jeder Ausgabe zur aktuellen Zeit ausdrucken lassen echo $timestamp. Es erwies sich als schwieriger als ich dachte. Hier sind einige Dinge, die ich versucht habe:

timestamp="(date +"%T")" Echo wird ausgedruckt (date +"%T")

timestamp="$(date +"%T")" echo gibt die Zeit aus, zu der die Variable initialisiert wurde.

Andere Dinge, die ich ausprobiert habe, sind nur geringfügige Abweichungen, die nicht besser funktionierten. Weiß jemand, wie man das erreicht, was ich versuche?

Dan
quelle

Antworten:

309

Um den aktuellen Zeitstempel und nicht den Zeitpunkt der Definition einer festen Variablen zu erhalten, besteht der Trick darin, eine Funktion und keine Variable zu verwenden:

#!/bin/bash

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

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

Wenn Ihnen das vom Bezeichner %Tangegebene Format nicht gefällt , können Sie die anderen von bezeichneten Zeitkonvertierungsbezeichner kombinieren date. Für GNU datefinden Sie die vollständige Liste dieser Spezifizierer in der offiziellen Dokumentation hier: https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers

Giordano
quelle
26
Abhängig davon, wie Sie dies verwenden möchten, müssen Sie weiterhin die Befehlsersetzung verwenden : echo "$(timestamp): something happened".
Chepper
5
In Bezug
zxq9
175
Für mich wollte ich date +"%Y-%m-%d_%H-%M-%S"
Kimball Robinson
3
Aus irgendeinem Grund gab mir dies nicht den Zeitstempel, sondern die aktuelle Zeit mit ":" dazwischen.
Erikbwork
7
Ich denke, viele Leute kommen zu dieser Frage und suchen nach einer Möglichkeit, einen Unix-Zeitstempel zu generieren (wie ich es getan habe) und finden die Antwort von dchakarov nützlicher, obwohl diese Antwort die Frage des Fragestellers besser anspricht.
Vastlysuperiorman
565

Wenn Sie einen Unix-Zeitstempel erhalten möchten, müssen Sie Folgendes verwenden:

timestamp=$(date +%s)

%Twird dir nur die Zeit geben; das gleiche wie %H:%M:%S(über http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ )

dchakarov
quelle
5
Aber diese Variable enthält nur den Wert der Zeit, als die Variable initiiert wurde. Stimmt das?
Lindhe
9
Ich denke, dies wird sehr positiv bewertet, da es den Titel der Frage beantwortet, aber nicht den Fragentext beantwortet: D OP wollte jedes Mal einen anderen Zeitstempel erhalten, während dies einen für das gesamte Skript speichert.
Fedorqui 'SO hör auf zu schaden'
1
Ich bin hierher gekommen, um genau das zu suchen. Dh die richtige Formatzeichenfolge, um einen Unix-Zeitstempel zu erhalten date. Ich habe jedoch auch die "richtige" Antwort positiv bewertet. Ich habe nicht danach gesucht, aber es ist eine bessere Antwort auf die ursprüngliche Frage und es ist auch sehr nützlich für mich.
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
quelle
1
danke, das wollte ich: einen Zeitstempel als Variable zur Wiederverwendung in meinem Skript! Die Shell-Syntax ist so verwirrend.
Poutrathor
2
+1 zum Hinzufügen des Millisekunden-Teils. Dies echo $(date +"%Y-%m-%dT%T.%3N%z") kann jedoch nicht in einem Mac-Terminal zum Laufen gebracht werden. So machen Sie dasselbe in Mac. Danke
kosgeinsky
43

Das ISO 8601-Format ( 2018-12-23T12:34:56) ist besser lesbar als der UNIX-Zeitstempel. Auf einigen Betriebssystemen können Sie jedoch keine :Dateinamen haben. Deshalb empfehle ich stattdessen Folgendes:

2018-12-23_12-34-56

Mit dem folgenden Befehl können Sie den Zeitstempel in diesem Format abrufen:

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

Dies ist das Format, das viele Anwendungen verwendet haben. Eine weitere nette Sache dabei ist, dass wenn Ihre Dateinamen damit beginnen, Sie sie alphabetisch sortieren können und sie nach Datum sortiert werden.

Caner
quelle
1
Vielen Dank, das ist großartig für mein Versionskontrollskript
Andy
1
TZ=UTC date +...kann dies mithilfe des UTC-Zeitstempels portabler machen
MichaelChirico
17

Ich benutze Ubuntu 14.04.

Der richtige Weg in meinem System sollte sein date +%s.

Die Ausgabe von date +%Tist wie 12:25:25.

Sean Lin
quelle
15

Befehlssubstitution verwenden:

timestamp=$( date +%T )
Choroba
quelle
3
Dies habe ich bereits versucht und es wird nur die Zeit ausgedruckt, zu der die Variable initialisiert wurde.
Dan
10
@ dan08: So funktionieren Variablen. Verwenden Sie eine Funktion, wenn Sie eine dynamische Ausgabe wünschen.
Choroba
11

Sie können verwenden

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

Dies liefert im Format 2014-02-01 15:12:35-05:00

Die Back-Tick ( `) -Zeichen bewirken, dass das, was sich zwischen ihnen befindet, ausgewertet wird und das Ergebnis in der Zeile enthalten ist. date --helphat andere Möglichkeiten.

Rechnung
quelle
1
Die Uhrzeit sollte unmittelbar vor der Aufnahme in die Bildschirmausgabe oder in eine Protokolldatei ausgeführt werden, in der die Zeit der Ausgabe aufgeführt sein soll.
Bill
2
Dies ist aufgrund des Platzes in der Ausgabe weniger als das ideale Format für einen Zeitstempel. Stellen Sie sicher, dass Sie bei der Verwendung "$ timestamp" angeben, da sonst zwei Parameter für den Befehl angezeigt werden. zB touch $timestampwerden zwei Dateien erzeugt.
Harschware
8

Neuere Versionen von basherfordern keinen Aufruf des externen Programms date:

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

%(...)TVerwendet das entsprechende Argument als UNIX-Zeitstempel und formatiert es gemäß dem strftimeFormat im Stil zwischen den Klammern. Ein Argument von -1entspricht der aktuellen Zeit, und wenn keine Mehrdeutigkeit auftreten würde, kann weggelassen werden.

chepner
quelle
5

Und für meine europäischen Mitbürger versuchen Sie Folgendes:

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

gibt ein Format des Formats an: "15-02-2020_19-21-58"

Sie rufen die Variable auf und erhalten die Zeichenfolgendarstellung wie folgt

$timestamp
Christoffer Nissen
quelle
1
Bitte verwenden Sie die Codenotation für Ihren Code.
Sao
4
timestamp=$(awk 'BEGIN {srand(); print srand()}')

srand ohne Wert verwendet den aktuellen Zeitstempel bei den meisten Awk-Implementierungen.

Steven Penny
quelle
Ich mag dieses, sehr kreativ!
TobiV