Просто используйте dateи верные секунды:
Как вы правильно заметили, многие детали базовых вычислений скрыты, если вы полагаетесь на арифметику английского времени. Например -d yesterday, и -d 1 day agoбудет иметь другое поведение.
Вместо этого вы можете надежно зависеть от (точно задокументированных) секунд, прошедших с UTC эпохи Unix, и арифметики bash, чтобы получить нужный момент:
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
Это было указано в другом ответе . Эта форма более переносима на платформах с разными dateфлагами командной строки, не зависит от языка (например, «вчера» или «выше» во французском языке), и, честно говоря (в долгосрочной перспективе) будет легче запомнить, потому что вы знаю это уже. В противном случае вы могли бы продолжать спрашивать себя: "Это было -d 2 hours agoили -d 2 hour agoснова?" или "Это -d yesterdayили -d 1 day agoчто я хочу?"). Единственный сложный момент здесь - это @.
Вооружен Башом и ничем иным:
Bash исключительно на bash, вы также можете получить вчерашнее время через встроенную функцию printf:
%(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.
Так,
# 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 ))
или, что эквивалентно с переменной temp (внешняя подоболочка необязательна, но сохраняет переменные среды чистыми).
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
Примечание: несмотря на то, что на man-странице указано, что ни один аргумент для средства %()Tформатирования не будет принимать значение по умолчанию -1, вместо этого я получаю 0 (спасибо, руководство по bash, версия 4.3.48)