我正在编写一个应该在 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'