Как я могу определить версию даты BSD и GNU в оболочке script
Я пишу оболочку script, которая должна выполнять некоторые манипуляции с строкой даты. script должен работать как можно больше вариантов * nix, поэтому мне нужно обрабатывать ситуации, когда машина может иметь BSD или версию даты GNU.
Какой будет самый элегантный способ тестирования для типа ОС, поэтому я могу отправить правильные флаги даты?
EDIT:
Чтобы уточнить, моя цель - использовать инструменты расчета даты относительно даты, которые кажутся отличными в BSD и GNU.
Пример BSD
date -v -1d
Пример GNU
date --date="1 day ago"
Ответы
Ответ 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 бесполезно или нет.