运行 循环中的命令,而无需每次都生成新的子 shell

Running commands in a loop without spawning a new subshell each time

我有一个 bash 脚本,它以纪元时间读取大量日期,并确定它们发生的一天中的(本地)小时。相关片段:

while read ts
do
  hour="$(date -d@$((${ts} / 1000)) +%H)"
  ((hourly_counts["${hour}"]+=1))
done < "${jqfile}"

它相当慢,因为每次调用 date 都会生成一个新的子 shell。有没有明智的方法来解决这个问题?看起来 date 不支持多个查询。

我能想到的就是生成一个新的 shell,然后通过管道将 date 命令传递给它并取回结果,以便它们都在同一个 shell 中执行.但我不清楚如何做到这一点,而且它似乎有点过度设计。

使用printf:

printf -v hour '%(%H)T' "$(( ts / 1000 ))"

键入 help printf 以了解有关该命令的更多信息。

同时勾选 strftime(3)。行为可能取决于 TZLC_TIME.

的值