date-Befehl, der ein oder zwei Tage zurückgeht. Verschiedene Flags werden angezeigt

date-Befehl, der ein oder zwei Tage zurückgeht. Verschiedene Flags werden angezeigt

Ich schreibe ein Bash-Skript, das unter OSX und Ubuntu laufen soll. Ich bin mir nicht sicher, ob dieses spezielle Problem auf eine Betriebssystem-Nichtübereinstimmung zurückzuführen ist. Wahrscheinlicher ist ein Unterschied im Datumsbefehl auf den beiden Shells, obwohl es auf beiden Bash ist. Mal sehen.

Um in der Bash-Shell von OSX ein Datum von vor zwei Tagen auszudrucken, gehen wir wie folgt vor:

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"

Unglücklicherweise --datewird das Flag in unserer OSX-Bash-Shell nicht erkannt.

Ich hätte gerne einen Befehl mit Flags, die in beiden Fällen funktionieren. Weiß jemand, was ich versuchen könnte?

Antwort1

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

Wie Sie festgestellt haben,unter OSX, das -dFlag datesteuert die Sommerzeit, während es unter Linux die Anzeigezeit festlegt. Unter OSX -vpasst es das Anzeigedatum an, aber unter Linux -vist das Flag eine ungültige Option.

Sowohl BSD als auch GNU streben größtenteils nach Kompatibilität mit dem POSIX-Standard. Wenn Sieder POSIX-Standard fürdateSie werden jedoch sehen, dass es in diesem Fall nicht hilft: Es unterstützt keine Syntax zum Anpassen des Datums.

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

[ "$(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"

Antwort2

Mitksh93(was meiner Meinung nach viel besser ist alsSchlagfür Skripting) können Sie das printfintegrierte Tool verwenden, z. B.:

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

verwandte Informationen