
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 -v
Flag ist jedoch in der Ubuntu-Bash-Shell ungültig. Stattdessen verwenden wir dort:
date --date="2 days ago" +"%Y"."%m"."%d"
Unglücklicherweise --date
wird 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
date
ist kein bash
integriertes 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 -d
Flag date
steuert die Sommerzeit, während es unter Linux die Anzeigezeit festlegt. Unter OSX -v
passt es das Anzeigedatum an, aber unter Linux -v
ist 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ürdate
Sie 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 printf
integrierte Tool verwenden, z. B.:
printf '%(%Y.%m.%d)T' '2 days ago'