Команда date, возвращаясь на один или два дня назад. Видя разные флаги

Команда date, возвращаясь на один или два дня назад. Видя разные флаги

Я пишу скрипт bash, который должен работать на OSX и Ubuntu. Я не уверен, вызвана ли эта конкретная проблема несоответствием ОС; скорее всего, это разница в команде date в двух оболочках, хотя в обеих оболочках это bash? Давайте посмотрим.

В оболочке bash OSX для вывода даты двухдневной давности мы делаем следующее:

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

Однако этот -vфлаг недействителен в оболочке Ubuntu bash. Вместо этого мы используем:

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

К сожалению, этот --dateфлаг не распознается в нашей оболочке OSX bash.

Мне бы хотелось получить одну команду с флагами, которая будет работать в обоих случаях. Может, кто-нибудь знает, что можно попробовать?

решение1

dateне bashвстроенная. Это системная утилита, и это то, чем отличаются OSX и Linux. OSX использует инструменты BSD, а Linux использует инструменты GNU. Они похожи, но не одинаковы.

Как вы обнаружили,на OSX, -dфлаг dateуправляет летним временем, тогда как в Linux он устанавливает время отображения. В OSX -vрегулирует дату отображения, но в Linux -vфлаг является недопустимой опцией.

По большей части, и BSD, и GNU стремятся к совместимости со стандартом POSIX. Если вы проверитестандарт POSIX дляdateОднако вы увидите, что в данном случае это бесполезно: синтаксис для корректировки даты не поддерживается.

Если вы хотите, чтобы ваш код работал на обеих платформах, попробуйте:

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

Или (требуется bash):

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

решение2

Скш93(что ИМХО гораздо лучше, чемБашдля написания скриптов) можно использовать printfвстроенную функцию, например:

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

Связанный контент