我正在编写一个需要进行一些日期字符串操作的Shell脚本。该脚本应在尽可能多的*nix变体上工作,因此我需要处理机器可能具有BSD或GNU版本日期的情况。
什么是检测操作系统类型最优雅的方式,以便我可以发送正确的日期标志?
编辑: 为了澄清,我的目标是使用date的相对日期计算工具,这在BSD和GNU中似乎是不同的。
BSD示例
date -v -1d
GNU 示例
date --date="1 day ago"
我正在编写一个需要进行一些日期字符串操作的Shell脚本。该脚本应在尽可能多的*nix变体上工作,因此我需要处理机器可能具有BSD或GNU版本日期的情况。
什么是检测操作系统类型最优雅的方式,以便我可以发送正确的日期标志?
编辑: 为了澄清,我的目标是使用date的相对日期计算工具,这在BSD和GNU中似乎是不同的。
BSD示例
date -v -1d
GNU 示例
date --date="1 day ago"
你想检测正在使用的date
命令的版本,而不仅仅是操作系统的版本。
GNU Coreutils date
命令接受--version
选项;其他版本不支持:
if date --version >/dev/null 2>&1 ; then
echo Using GNU date
else
echo Not using GNU date
fi
但正如William Pursell所建议的,如果可能的话,您应该只使用两者都共有的功能。
(我认为GNU日期可用的选项基本上是BSD版本可用选项的超集;如果是这种情况,那么假设BSD版本的代码应该可以在GNU版本上工作。)
使用便携式标志。标准可在此处获得 here
对于打印相对日期的特定问题,可能比使用date更容易使用perl:
perl -E 'say scalar localtime(time - 86400)'
请注意,这种解决方案在23或25小时的日子里完全失败,但是有很多Perl解决方案可用于解决该问题。请参阅Perl FAQ。
但是,您肯定可以使用Keith的想法的变体并执行:
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
perl -E 'say "blah"'
对我来说不起作用,所以我不得不使用 perl -e 'print "blah\n"'
。 - MarkHuif is-compatible-date-v; then
date -v -1d
elif is-compatible-date-d; then
date --date="1 day ago"
fi
function is-compatible () {
"$@" >/dev/null 2>&1
}
function is-compatible-date-v () {
is-compatible date -v +1S
}
function is-compatible-date-d () {
is-compatible date -d '1 second'
}
$ xsh x/date/adjust +21d 2008-10-10
2008-10-31
这是一个名为xsh-lib/core
的库的一部分。要使用它们,您需要同时拥有xsh
和xsh-lib/core
两个仓库,我在下面列出了它们:
回答你的问题,可能你需要使用"uname -o"命令。在我的情况下,它是"GNU/Linux"。你可以自己决定检测操作系统类型是否有用。