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

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

我正在编写一个应该在 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 无法识别该标志。

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

答案1

date不是bash内置的。它是一个系统实用程序,这是 OSX 和 Linux 的不同之处。 OSX 使用 BSD 工具,而 Linux 使用 GNU 工具。它们相似但不相同。

正如您所发现的,在 OSX 上,控制夏令时-d的标志,而在 Linux 上,它设置显示时间。date在 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"

或者(需要 bash):

[ "$OSTYPE" = linux-gnu ] && date --date="2 days ago" +"%Y"."%m"."%d" || date -v-2d +"%Y"."%m"."%d"

答案2

克什93(恕我直言,这比巴什对于脚本编写)您可以使用printf内置函数,例如:

printf '%(%Y.%m.%d)T' '2 days ago'

相关内容