在任何符合POSIX标准的shell中获取自纪元以来的秒数

mat*_*tbh 6 shell scripting time posix

我想知道是否有办法在任何符合POSIX标准的shell中获得自UNIX纪元以来的秒数,而无需使用perl之类的非POSIX语言,或使用非POSIX扩展(如GNU awk的strftime函数).

以下是我已经排除的一些解决方案......

date +%s //不适用于Solaris

我见过一些shell脚本 建议之前,其解析输出date,然后获得从格式化的公历日期秒,但他们似乎并没有采取像闰秒细节考虑在内.

GNU awk具有该strftime功能,但这在标准中不可用awk.

我可以编写一个调用该time函数的小型C程序,但该二进制文件将特定于特定的体系结构.

是否有使用POSIX兼容工具的跨平台方式?

我很想放弃并接受对perl的依赖,这至少是广泛部署的.

perl -e'print time'//作弊(非POSIX),但应该适用于大多数平台

jll*_*gre 11

这是一个便携/ POSIX解决方案:

PATH=`getconf PATH` awk 'BEGIN{srand();print srand()}'
Run Code Online (Sandbox Code Playgroud)

不同于C编译器或Perl,awk保证是存在于符合POSIX标准环境.

这个怎么运作:

  • PATH =`getconf PATH`确保调用它的POSIX版本,awk如果它不是第一个PATH.

  • 根据POSIX标准: srand([expr]) 如果省略expr,则将rand的种子值设置为expr或使用时间.应返回先前的种子值.

    第一个调用是省略参数,因此种子值设置为一天中的时间.第二个调用是返回那个时间,这是自纪元以来的秒数.

    请注意,对于许多awk实现但不是GNU one(gawk),第一次调用不是必需的,因为函数已经首先返回了期望值.