Kann der Datumsbefehl einen anderen Datumsbefehl in einer Datei als Argument annehmen?

Kann der Datumsbefehl einen anderen Datumsbefehl in einer Datei als Argument annehmen?

Ich lese gerade dieGNU Coreutils-Handbuch, und ich experimentiere mit dem  dateBefehl. Folgendes habe ich im Text gefunden:

  1. Der dateBefehl hat eine Option:-f datefile

    • Analysieren Sie jede Zeile inDatumsdateiwie bei -d und zeigen Sie das resultierende Datum und die Uhrzeit an.
    • das heißt date, jede Zeile inDatumsdatei und behandeln Sie es als Datumszeichenfolge zur Anzeige eines bestimmten Datums.
  2. InKapitel 29 (Datumseingabeformate), es ist angegeben:

    Die Ausgabe des dateBefehls ist nicht immer als Datumszeichenfolge akzeptabel, nicht nur aufgrund des Sprachproblems, sondern auch, weil es für Zeitzonenelemente wie „IST“ keine Standardbedeutung gibt.  Bei der Verwendung datezur Generierung einer Datumszeichenfolge, die später analysiert werden sollein Datumsformat angeben, das sprachunabhängig ist und keine anderen Zeitzonenelemente als „UTC“ und „Z“ verwendet. Hier sind einige Möglichkeiten, dies zu tun:

    $ LC_ALL=C TZ=UTC0 date
    
    • Diese Aussage (vor allem der fettgedruckte Teil) impliziert für mich, dass ich in der Lage sein sollte, Datumsdateiein  dateBefehl wie der oben genannte, und der  dateBefehl, den ich im Terminal ausgebe, sollte in der Lage sein, diesen dateBefehl in derDatumsdatei und geben Sie das entsprechende Datum aus.

Bei mir funktioniert es nicht. Entweder stimmt etwas mit meinem Datumsbefehl in der Datumsdatei nicht (falsche Anführungszeichen, eine spezielle Syntax, die ich nicht kenne ...), oder die -f datefileOption kann mit dieser Situation nicht umgehen.

Zusammengefasst frage ich:

  • Kann dem date -fBefehl eine Datei zugeführt werden, bei der die Datumszeichenfolge in einer Zeile ein weiterer Datumsbefehl ist? Kann ich beispielsweise in die erste Zeile einer Datei die Zeichenfolge „date“ einfügen (die als Befehl die Systemzeit zurückgeben würde) und diese Datei dann in einen  date -fBefehl einspeisen und die aktuelle Systemzeit abrufen (die durch den  dateBefehl in der Datei generiert wird)?

Antwort1

Das richtige Format für eine Datums-/Uhrzeitangabe, das von GNU Date korrekt analysiert wird, lautet:

$ LC_ALL=C TZ=UTC0 date +"%Y-%m-%dT%H:%M:%S%z"
2016-09-28T04:08:55+0000

Außerdem werden dadurch Leerzeichen vermieden, die andere Probleme verursachen können.

Wenn Ihre Datei eine Zeile pro Datum enthält, wie:

$ cat dates.txt
1992-03-28T14:26:01+0000
2004-02-29T21:02:02+0000
2005-02-28T21:02:03+0000
2015-07-02T11:52:04+0000
2016-03-31T01:36:05+0000

Dann klappt es:

$ TZ=America/Los_Angeles date -f infile
Sat Mar 28 06:26:01 PST 1992
Sun Feb 29 13:02:02 PST 2004
Mon Feb 28 13:02:03 PST 2005
Thu Jul  2 04:52:04 PDT 2015
Wed Mar 30 18:36:05 PDT 2016


Wenn Sie eine Datei mit „Datumsbefehlen“ wie folgt erstellen möchten:

$ cat dates.txt
date -d "1992-03-28T14:26:01+0000"
date -d "2004-02-29T21:02:02+0000"
LC_ALL=C TZ=UTC0 date -d "2005-02-28T21:02:03+0000" +"%Y-%m-%d"
TZ=America/Los_Angeles date -d "2005-02-28T21:02:03+0000"
date -d "2015-07-02T11:52:04+0000"
date -d "2016-03-31T01:36:05+0000"

Anschließend müssen Sie jede Zeile mit der Shell ausführen.
Eine schnelle Lösung besteht darin, die Datei als Quelle zu verwenden, und alle Befehle werden ausgeführt.

$ . ./dates.txt
Sat Mar 28 14:26:01 GMT 1992
Sun Feb 29 21:02:02 GMT 2004
2005-02-28
Mon Feb 28 13:02:03 PST 2005
Thu Jul  2 11:52:04 GMT 2015
Thu Mar 31 01:36:05 GMT 2016

Beantwortet das deine Frage?

Antwort2

Mit dateab coreutils 8.21, TZ=UTC und LC_ALL=CI erhalten

$ date > x; sleep 1; date >> x; sleep 1; date >> x
$ date -f x
Wed Sep 28 03:32:39 UTC 2016
Wed Sep 28 03:32:40 UTC 2016
Wed Sep 28 03:32:41 UTC 2016
$

wie erwartet. Ich habe auch den Quellcode überprüft: Die Magie geschieht in der Routine, wo im Wesentlichen eine Schleife über / batch_convertstattfindet , genau wie im Fall der Befehlszeile (mit ).parse_datetime()show_date()-d

Antwort3

Nein, Sie können nicht LC_ALL=C TZ=UTC0aus einer Datei mit lesen date -f.

cat tz
LC_ALL=C TZ=UTC0

date -f tz
date: invalid date ”LC_ALL=C TZ=UTC0”

Sie können den gesamten Befehl jedoch wie folgt in eine Datei einfügen:

cat date
#!/bin/bash

LC_ALL=C TZ=UTC0 date

Führen Sie es dann über die Befehlszeile aus. Sie erhalten Folgendes:

./date 
Tue Sep 27 06:56:29 UTC 2016

Im Gegensatz zur Zeitzone auf meinem Server, die ist:

date
tis 27 sep 2016 08:56:52 CEST

verwandte Informationen