Po prostu użyj date
i zaufane sekundy:
Jak słusznie zauważyłeś, wiele szczegółów dotyczących podstawowych obliczeń jest ukrytych, jeśli polegasz na angielskiej arytmetyce czasu. Np. -d yesterday
I -d 1 day ago
będzie się zachowywał inaczej.
Zamiast tego możesz niezawodnie polegać na (dokładnie udokumentowanych) sekundach od czasu UTC w epoce unixa i na arytmetyce basha, aby uzyskać odpowiedni moment:
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
Wskazano na to w innej odpowiedzi . Ten formularz jest bardziej przenośny na różnych platformach z różnymi date
flagami wiersza poleceń, jest niezależny od języka (np. „Wczoraj” kontra „hier” w języku francuskim) i, szczerze mówiąc (w dłuższej perspektywie), będzie łatwiejszy do zapamiętania, ponieważ już to wiem. W przeciwnym razie możesz zadawać sobie pytanie: „Czy to było -d 2 hours ago
czy -d 2 hour ago
znowu?” lub „Czy to -d yesterday
albo -d 1 day ago
że chcę?”). Jedynym trudnym fragmentem jest tutaj @
.
Uzbrojony w bash i nic więcej:
Bash wyłącznie na bash, możesz również uzyskać wczorajszy czas, za pomocą wbudowanego 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.
Więc,
# 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 ))
lub równoważnie ze zmienną temp (zewnętrzna podpowłoka jest opcjonalna, ale utrzymuje zmienne środowiskowe w czystości).
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
Uwaga: pomimo strony podręcznika informującej, że żaden argument do programu %()T
formatującego nie przyjmie wartości domyślnej -1
, zamiast tego wydaje mi się, że otrzymuję 0 (dziękuję, wersja podręcznika bash 4.3.48)