Bash 的 printf '%(%F %T)T' 的奇怪结果

Fra*_*ona 1 bash printf date

你如何解释这一点?这是一个错误还是我忽略了什么?

#!/bin/bash

printf '%(%F %T)T\n' 3 2 1 0 -1 -2 -3
Run Code Online (Sandbox Code Playgroud)
1970-01-01 00:00:03
1970-01-01 00:00:02
1970-01-01 00:00:01
1970-01-01 00:00:00
2023-08-16 19:31:33
2023-08-14 22:56:58
1969-12-31 23:59:57
Run Code Online (Sandbox Code Playgroud)

Cyr*_*rus 5

只有-1-2被定义。从man bash

%(datefmt)T:导致 printf 输出使用 datefmt 作为 strftime(3) 的格式字符串所产生的日期时间字符串。相应的参数是一个整数,表示自纪元以来的秒数。可以使用两个特殊的参数值:-1 表示当前时间-2 表示调用 shell 的时间。如果未指定参数,则转换的行为就像已给出 -1 一样。这是通常 printf 行为的一个例外。

  • 实际上并不是只定义了“-1”和“-2”,而是它们被定义为具有不同于该上下文中所有其他数字的特定含义。因此 `printf '%(%F %T)T\n' 0` 被定义为纪元的开始,`printf '%(%F %T)T\n' -3` 被定义为 3 秒在纪元开始之前,而“-1”和“-2”的定义如您所解释的。 (3认同)