Как я могу обнаружить версию даты BSD против GNU в сценарии оболочки - PullRequest
16 голосов
/ 05 января 2012

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

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

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

Пример BSD

date -v -1d

Пример GNU

date --date="1 day ago"

Ответы [ 3 ]

13 голосов
/ 05 января 2012

Вы хотите определить, какую версию команды 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. )

8 голосов
/ 05 января 2012

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

Для конкретной проблемы печати относительной даты, вероятно, проще использовать 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")
1 голос
/ 06 января 2012

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

...