Verwenden Sie einfach dateund vertrauenswürdige Sekunden:
Wie Sie zu Recht betonen, sind viele Details der zugrunde liegenden Berechnung verborgen, wenn Sie sich auf die englische Zeitarithmetik verlassen. ZB -d yesterdayund -d 1 day agowird ein anderes Verhalten haben.
Stattdessen können Sie sich zuverlässig auf die (genau dokumentierten) Sekunden seit der Unix-Epoche UTC und die Bash-Arithmetik verlassen, um den gewünschten Moment zu erhalten:
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
Darauf wurde in einer anderen Antwort hingewiesen . Dieses Formular ist plattformübergreifend mit unterschiedlichen dateBefehlszeilenflags portabler, sprachunabhängig (z. B. "gestern" vs "hier" im französischen Gebietsschema) und offen gesagt (auf lange Sicht) leichter zu merken, weil Sie weiß es schon. Sie könnten sich sonst immer wieder fragen: "War es -d 2 hours agooder -d 2 hour agowieder?" oder "Ist es -d yesterdayoder -d 1 day agodas ich will?"). Das einzig schwierige hier ist das @.
Bewaffnet mit Bash und sonst nichts:
Bash nur auf Bash, können Sie auch die gestrige Zeit über die eingebaute printf erhalten:
%(datefmt)T
causes printf to output the date-time string resulting from using
datefmt as a format string for strftime(3). The corresponding argu‐
ment is an integer representing the number of seconds since the
epoch. Two special argument values may be used: -1 represents the
current time, and -2 represents the time the shell was invoked.
If no argument is specified, conversion behaves as if -1 had
been given.
This is an exception to the usual printf behavior.
So,
# inner printf gets you the current unix time in seconds
# outer printf spits it out according to the format
printf "%(%Y-%m-%d)T\n" $(( $(printf "%(%s)T" -1) - 24*3600 ))
oder äquivalent zu einer temporären Variablen (äußere Unterschale optional, hält aber Umgebungsvariablen sauber).
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
Hinweis: Obwohl auf der Manpage angegeben ist, dass kein Argument für den %()TFormatierer einen Standardwert -1annimmt, erhalte ich stattdessen eine 0 (danke, Bash-Handbuch Version 4.3.48).