Как я могу определить версию даты BSD и GNU в оболочке script - программирование
Подтвердить что ты не робот

Как я могу определить версию даты BSD и GNU в оболочке script

Я пишу оболочку script, которая должна выполнять некоторые манипуляции с строкой даты. script должен работать как можно больше вариантов * nix, поэтому мне нужно обрабатывать ситуации, когда машина может иметь BSD или версию даты GNU.

Какой будет самый элегантный способ тестирования для типа ОС, поэтому я могу отправить правильные флаги даты?

EDIT: Чтобы уточнить, моя цель - использовать инструменты расчета даты относительно даты, которые кажутся отличными в BSD и GNU.

Пример BSD

date -v -1d

Пример GNU

date --date="1 day ago"
4b9b3361

Ответ 1

Используйте переносные флаги. Стандарт доступен здесь

Для конкретной проблемы печати относительной даты, вероятно, проще использовать perl, чем дату:

perl -E 'say scalar localtime( time - 86400 )'

(обратите внимание, что это решение не работает в течение 23 или 25 часов в сутки, но для решения этой проблемы доступно множество решений на perl. См. perl faq.)

но вы наверняка могли бы использовать вариант идеи Кейта и сделать:

if date -v -1d > /dev/null 2>&1; then
  DATE='date -v 1d'
else
  DATE='date --date="1 day ago"'
fi
eval $DATE

или просто

DATE=$(date -v -1d 2> /dev/null) || DATE=$(date --date="1 day ago")

Другая идея состоит в том, чтобы определить функцию для использования:

if date -v -1d > /dev/null 2>&1; then
    date1d() { date -v -1d; }
else
    date1d() { date --date='1 day ago'; }
fi

Ответ 2

Вы хотите определить, какую версию команды date вы используете, не обязательно версию ОС.

Команда GNU Coreutils date принимает параметр --version; других версий нет:

if date --version >/dev/null 2>&1 ; then
    echo Using GNU date
else
    echo Not using GNU date
fi

Но, как предлагает Уильям Пурселл, если это вообще возможно, вы должны просто использовать функциональность, общую для обоих.

(Я думаю, что параметры, доступные для даты GNU, в значительной степени являются надмножеством тех, которые доступны для версии BSD, и если это так, то код, предполагающий версию BSD, должен работать с версией GNU.)

Ответ 3

Чтобы просто ответить на ваш вопрос, возможно, "uname -o" - это то, что вы хотите. В моем случае это "GNU/Linux". Вы можете решить для себя, если обнаружение типа os бесполезно или нет.