
Я пишу скрипт 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'