使用日期实用程序打印纪元时间

mbi*_*ras 14 command-line shell date quoting

通过阅读另一个答案,我知道以下命令可用于打印当前纪元时间

$ date +'%s'
1491150773
Run Code Online (Sandbox Code Playgroud)

通过阅读date(1)手册页(注意:我实际上使用的是 macOS),我找到了一个说明用法的示例:

 Finally the command:

 date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"

 can be used to parse the output from date and express it in Epoch time.
Run Code Online (Sandbox Code Playgroud)

从阅读示例来看,似乎+可以放在单引号内:

$ date '+%s'
1491150781
Run Code Online (Sandbox Code Playgroud)

即使我能够成功打印当前的纪元时间,我也不明白它为什么起作用并且有一些问题:

  • 为什么要date +'%s'打印当前纪元时间?有没有更通用的例子来说明它在这个例子中的用法背后的模式?
  • 为什么我可以把+引号放在里面?

我试过将命令放入explainshell,但它不是很有帮助:

在此处输入图片说明

cuo*_*glm 24

BSD 日期和 GNU 日期都具有以下形式:

date +FORMAT
Run Code Online (Sandbox Code Playgroud)

withFORMAT是用于显示日期的输出格式字符串。因此,您将提供给date的只是一个字符串,以+.

在将字符串传递给 之前date,该字符串由您的 shell 解释。So +%sor +'%s'or"+%s"两者都是等价的,被所有 POSIX shell 按原样解释。

唯一的优点+'%s'是您可以快速检测使用了哪种字符串格式,或者复制、解析它而无需担心+.

此外,+'FORMAT'当您使用某些特殊格式时,将帮助您,这些格式可以解释为您的外壳扩展。示例zsh

date +'(%s)'
Run Code Online (Sandbox Code Playgroud)

会在以下情况下工作:

date +(%s)
Run Code Online (Sandbox Code Playgroud)

不会。