comando date, voltando um ou dois dias. Vendo bandeiras diferentes

comando date, voltando um ou dois dias. Vendo bandeiras diferentes

Estou escrevendo um script bash que deve ser executado no OSX e no Ubuntu. Não tenho certeza se esse problema específico se deve a uma incompatibilidade de sistema operacional; é mais provável que seja uma diferença no comando date nos dois shells, mesmo que seja bash em ambos? Vamos ver.

No shell bash do OSX, para imprimir uma data de dois dias atrás, estamos fazendo o seguinte:

date -v-2d +"%Y"."%m"."%d"

No entanto, esse -vsinalizador é inválido no shell bash do Ubuntu. Em vez disso, estamos usando:

date --date="2 days ago" +"%Y"."%m"."%d"

Infelizmente, o --datesinalizador não é reconhecido em nosso shell bash OSX.

Eu adoraria um comando com sinalizadores que funcionassem em ambos os casos. Alguém saberia o que eu poderia tentar?

Responder1

datenão é um bashembutido. É um utilitário de sistema e isso é algo em que o OSX e o Linux diferem. OSX usa ferramentas BSD enquanto o Linux usa ferramentas GNU. Eles são semelhantes, mas não iguais.

Como você descobriu,no OSX, o -dsinalizador para datecontrolar o horário de verão, enquanto no Linux ele define o horário de exibição. No OSX, -vajusta a data de exibição, mas no Linux a -vflag é uma opção inválida.

Na maior parte, tanto o BSD quanto o GNU buscam compatibilidade com o padrão POSIX. Se você verificaro padrão POSIX paradate, porém, você verá que não ajuda em nada neste caso: ele não suporta nenhuma sintaxe para ajustar a data.

Se você quiser que seu código funcione em ambas as plataformas, tente:

[ "$(uname)" = Linux ] && date --date="2 days ago" +"%Y"."%m"."%d" || date -v-2d +"%Y"."%m"."%d"

Ou (requer bash):

[ "$OSTYPE" = linux-gnu ] && date --date="2 days ago" +"%Y"."%m"."%d" || date -v-2d +"%Y"."%m"."%d"

Responder2

Comksh93(que é IMHO muito melhor do quefestapara scripts) você pode usar o printfembutido, por exemplo:

printf '%(%Y.%m.%d)T' '2 days ago'

informação relacionada