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)