Basta usar datee segundos confiáveis:
Como você corretamente aponta, muitos detalhes sobre o cálculo subjacente ficam ocultos se você confiar na aritmética do tempo em inglês. Por exemplo -d yesterday, e -d 1 day agoterá um comportamento diferente.
Em vez disso, você pode confiar de forma confiável nos segundos (documentados com precisão) desde a época UTC do unix, e na aritmética do bash para obter o momento que deseja:
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
Isso foi apontado em outra resposta . Esse formulário é mais portátil em plataformas com diferentes datesinalizadores de linha de comando, é independente do idioma (por exemplo, "ontem" vs "hier" na localidade francesa) e, francamente (a longo prazo), será mais fácil lembrar, porque, bem, você já sabe disso. Caso contrário, você pode continuar se perguntando: "Foi -d 2 hours agoou de -d 2 hour agonovo?" ou "É -d yesterdayou -d 1 day agoeu quero?"). A única parte complicada aqui é a@ .
Armado com bash e nada mais:
Bash apenas no bash, você também pode obter o horário de ontem, através do printf incorporado:
%(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.
Assim,
# 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 ))
ou, de forma equivalente a uma variável temp (subshell externo opcional, mas mantém os vars do ambiente limpos).
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
Nota: apesar da página de manual declarando que nenhum argumento para o %()Tformatador assumirá um padrão -1, parece que recebo um 0 (obrigado, versão manual do bash 4.3.48)