在 bash 中使用多行“date”会出现什么问题?

在 bash 中使用多行“date”会出现什么问题?

我目前正在阅读一本关于 Bash 编程的书,Pro Bash Programming。在一章(第 4 章)中,他们问了以下脚本有什么问题。我自己读完后也不知道。我肯定是漏掉了什么。有人能告诉我这里的问题是什么吗?

year=$( date +%Y )
month=$( date +%m )
day=$( date +%d )
hour=$( date +%H )
minute=$( date +%M )
second=$( date +%S )

答案1

如果您在 12 月 31 日 23:59:59 运行这些命令,并且在您获得月份之后时钟滴答到下一秒,会怎么样?

更安全:

read year month day hour minute second < <( date "+%Y %m %d %H %M %S" )

如果使用这些值进行算术运算,请小心:shell 认为0809是无效的八进制数,而不是有效的十进制数。

答案2

我不认为有真正的错误在脚本中。但很有可能,当单独读取所有字符串时,您最终读取的“秒”值与之前的“分钟”不对应,因为它已经发生了变化……

答案3

我注意到的一件事是,它不安全地假设所有 6 次调用都date将在同一秒执行。想象一下,如果脚本在 2015-12-31 23:59:59.999(加减几微秒)左右到达第一行会发生什么?

答案4

我碰巧知道这本书。读到第 9 章,你会发现一节关于从单个命令设置多个变量的内容。他们会在那里解释这里发生了什么。

概括来说,它 a) 效率低下(调用日期相当昂贵),并且 b) 有风险,原因由 jcoppens 给出。

相关内容