625 Stimmen

Erstellen Sie eine Zeitstempelvariable im Bash-Skript

Ich versuche, eine Zeitstempelvariable in einem Shell-Skript zu erstellen, um das Protokollieren etwas einfacher zu machen. Ich möchte die Variable am Anfang des Skripts erstellen und möchte, dass sie die aktuelle Zeit ausgibt, wann immer ich echo $timestamp verwende. Es ist schwieriger als ich dachte. Hier sind einige Dinge, die ich ausprobiert habe:

timestamp="(date +"%T")" echo gibt (date +"%T") aus

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

Andere Dinge, die ich ausprobiert habe, waren nur leichte Variationen, die nicht besser funktionierten. Weiß jemand, wie ich erreichen kann, was ich versuche zu tun?

15voto

Bill Punkte 167

Du kannst verwenden

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

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

Die Back-Tick (`) Zeichen sorgen dafür, dass das zwischen ihnen Stehende ausgewertet wird und das Ergebnis in die Zeile aufgenommen wird. date --help bietet andere Optionen.

8voto

F. Hauri Punkte 57640

Vermeiden Sie Gabeln!!!

Es ist übertrieben, date für jede protokollierte Zeile auszuführen!!

Verwenden Sie wann immer möglich die integrierten Funktionen von bash.

AKTUALISIERUNG 2023

Zur Zeit, als diese Frage gestellt wurde, war die bash-Version bash-4.2.

In dieser Version ist der reine bash-Weg zum Drucken der aktuellen Zeit:

printf '%(%T)T\n' -1

oder

printf '%(%T)T\n' -1

Ein kurze Funktion zum Protokollieren jeder Zeile mit Zeitstempel könnte sein:

logLine() {
    printf '%(%T)T %s\n' -1 "$*"
}

Dann

$ logLine Hallo Welt.
10:11:32 Hallo Welt.

Um eine Variable festzulegen, verwenden Sie:

printf -v varname '%(%T)T' -1

oder um den UNIX EPOCH zu erhalten:

printf -v varname '%(%s)T' -1

Dann

printf 'Gespeicherter Zeitstempel ist: %(%c)T\n' "$varname"
Gespeicherter Zeitstempel ist: Sat Jan 27 04:26:00 2018

Heute verwende ich bash >= 5.1.4...

Ab Version 5.0-alpha von bash, (2018-05-22):

b. Es gibt eine Variable EPOCHSECONDS, die sich auf die Zeit in Sekunden seit dem Unix-Epoche bezieht.

c. Es gibt eine Variable EPOCHREALTIME, die sich auf die Zeit in Sekunden seit der Unix-Epoche mit Mikrosekunden-Genauigkeit bezieht.

Wenn Sie also Mikrosekunden-Genauigkeit verwenden möchten, könnte die Funktion wie folgt aussehen:

logLine() {
    local now=$EPOCHREALTIME
    printf '%(%T)T.%s %s\n' ${now%.*} ${now#*.} "$*"
}

Dann

$ logLine Hallo Welt.
10:15:56.862732 Hallo Welt.

Wichtig: Siehe: Mischen Sie nicht EPOCHREALTIME und EPOCHSECONDS!!!

7voto

Jonathan L Punkte 7682

Ein Zeitstempelformatierungstrick für GNU Bash, Version 4.4.20(1)-Release (x86_64-pc-linux-gnu)

 echo "$(date +%Y-%m-%d_%H:%M:%S.%6N) Info >>> enter main"

Ausgabe:

 2023-01-08_23:08:48.013592 Info >>> enter main

Wenn Sie '_' durch ein Leerzeichen ersetzen möchten, führen Sie Folgendes aus (ohne '\' Fehlermeldung erhalten)

 echo "$(date +%Y-%m-%d\ %H:%M:%S.%6N) Info >>> enter main"
 echo "$(date +%Y-%m-%d\ %T.%6N) Info >>> enter main"

Ausgabe:

 2023-01-08 23:10:40.692674 Info >>> enter main

5voto

Zombo Punkte 1
timestamp=$(awk 'BEGIN {srand(); print srand()}')

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

4voto

andranikasl Punkte 977

Sie können dies mit den folgenden Befehlen tun.

Für Zeitstempel mit Sekunden: checkDate=$(date "+%s")

Für formatiertes Datum: checkDate=$(date "+%Y-%m-%d %H:%M:%S")

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X