date 命令,返回一两天。看到不同的旗帜

jkj*_*000 11 shell-script date portability

我正在编写一个应该在 OSX 和 Ubuntu 上运行的 bash 脚本。我不确定这个特殊问题是否是由于操作系统不匹配造成的;更可能是两个 shell 上的 date 命令有所不同,即使它在两个 shell 上都是 bash?让我们来看看。

在 OSX 的 bash shell 上,为了打印两天前的日期,我们这样做:

date -v-2d +"%Y"."%m"."%d"

但是,该-v标志在 Ubuntu bash shell 上无效。相反,我们正在使用:

date --date="2 days ago" +"%Y"."%m"."%d"

不幸的--date是,我们的 OSX bash shell 无法识别该标志。

我想要一个带有在两种情况下都可以使用的标志的命令,有人知道我可以尝试什么吗?

Joh*_*024 17

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"
Run Code Online (Sandbox Code Playgroud)

或者(需要 bash):

[ "$OSTYPE" = linux-gnu ] && date --date="2 days ago" +"%Y"."%m"."%d" || date -v-2d +"%Y"."%m"."%d"
Run Code Online (Sandbox Code Playgroud)