date, voltando um ou dois dias. Vendo bandeiras diferentes

7

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

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

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

Esse -v flag é inválido no shell bash do Ubuntu. Em vez disso, estamos usando:

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

De forma não-intencional, o --date flag não é reconhecido em nosso shell bash do OSX.

Eu adoraria um comando com sinalizadores que funcionassem nos dois casos, alguém saberia o que eu poderia tentar?

    
por jkj2000 17.10.2014 / 00:25

2 respostas

12

date não é bash builtin. É um utilitário do sistema e é algo em que o OSX e o Linux são diferentes. O OSX usa ferramentas BSD enquanto o Linux usa ferramentas GNU. Eles são semelhantes, mas não são os mesmos.

Como você encontrou, no OSX , o sinal -d to date controla o horário de verão, enquanto no Linux, define o horário de exibição. No OSX, -v ajusta a data de exibição, mas, no Linux, o -v flag é uma opção inválida.

Na maioria das vezes, tanto o BSD quanto o GNU buscam compatibilidade com o padrão POSIX. Se você verificar o padrão POSIX para date , você verá que não é ajuda neste caso: não suporta qualquer sintaxe para ajustar a data.

Se você quiser que seu código funcione nas duas 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"
    
por 17.10.2014 / 01:21
-1

Com ksh93 (que é IMHO muito melhor do que bash para scripts) você pode usar o printf construído, por exemplo:

printf '%(%Y.%m.%d)T' '2 days ago'
    
por 24.08.2017 / 09:36