Datumsbefehl, ein oder zwei Tage zurück. Verschiedene Flaggen sehen

9

Ich schreibe ein Bash-Skript, das unter OSX und Ubuntu ausgeführt werden soll. Ich bin nicht sicher, ob dieses spezielle Problem auf eine Nichtübereinstimmung des Betriebssystems zurückzuführen ist. Wahrscheinlicher ist es ein Unterschied im Datumsbefehl für die beiden Shells, obwohl es sich um einen Schlag auf beide handelt? Wir werden sehen.

In der Bash-Shell von OSX tun wir Folgendes, um ein Datum von vor zwei Tagen zu drucken:

date -v-2d +"%Y"."%m"."%d"

Dieses -vFlag ist jedoch in der Ubuntu-Bash-Shell ungültig. Stattdessen verwenden wir dort:

date --date="2 days ago" +"%Y"."%m"."%d"

Leider wird das --dateFlag in unserer OSX-Bash-Shell nicht erkannt.

Ich würde gerne einen Befehl mit Flags verwenden, die in beiden Fällen funktionieren. Würde jemand wissen, was ich versuchen könnte?

jkj2000
quelle
Das hat nichts damit zu tun bash. Es ist ein Problem mit verschiedenen Implementierungen von date.
Cyrus

Antworten:

15

dateist kein basheingebauter. Es ist ein Systemdienstprogramm, auf dem sich OSX und Linux unterscheiden. OSX verwendet BSD-Tools, während Linux GNU-Tools verwendet. Sie sind ähnlich, aber nicht gleich.

Wie Sie festgestellt haben, wird unter OSX das -dFlag zur dateSteuerung der Sommerzeit festgelegt, während unter Linux die Anzeigezeit festgelegt wird. Passt unter OSX -vdas Anzeigedatum an, unter Linux ist das -vFlag jedoch eine ungültige Option.

Zum größten Teil bemühen sich sowohl BSD als auch GNU um Kompatibilität mit dem POSIX-Standard. Wenn Sie jedoch den POSIX-Standarddate überprüfen , werden Sie feststellen, dass dies in diesem Fall keine Hilfe ist: Es wird keine Syntax zum Anpassen des Datums unterstützt.

Wenn Ihr Code auf beiden Plattformen funktionieren soll, versuchen Sie Folgendes:

[ "$(uname)" = Linux ] && date --date="2 days ago" +"%Y"."%m"."%d" || date -v-2d +"%Y"."%m"."%d"

Oder (erfordert Bash):

[ "$OSTYPE" = linux-gnu ] && date --date="2 days ago" +"%Y"."%m"."%d" || date -v-2d +"%Y"."%m"."%d"
John1024
quelle
-1

Mit ksh93 (was meiner Meinung nach viel besser ist als Bash für printfSkripte ) könnten Sie das eingebaute verwenden, z.

printf '%(%Y.%m.%d)T' '2 days ago'
jelmd
quelle