1

下面显示的时钟操作在具有 TCL 8.5 的 Linux 机器上运行良好。但是当我在具有 TCL8.4 的 SunOS 上使用它时,我收到错误“错误开关“-format”:必须是 -base 或 -gmt”。

出于某种原因,我无法在 SunOS 中将我的 TCL 8.4 升级到 8.5。

我怎样才能让它在 TCL 8.4 中也能工作?

下面给出了命令,我试图通过这些命令实现的是将系统日期提前一天。

$today 包含值“2012 06 15 14 39 20”

set today [clock scan $today -format "%Y %m %d %H %M %S"]      
set tomorrow [clock add $today 86600 seconds]
set victim [clock format $tomorrow -format "%a"]
set tomorrow [clock format $tomorrow -format "%m%d%H%M"]
send "sudo date $tomorrow\r"
4

2 回答 2

5

杰克逊的回答是问题的核心:8.5 添加了很多功能clock,您的代码依赖于它们。但是,他并没有完全确定获得目标时间的最佳方法。

# Multiple assignment from list
foreach {YY MM DD HH mm ss} $today break
# Get the date tomorrow in one funky step
set tomorrow [clock scan "$YY$MM$DD $HH$mm$ss + 86600 seconds"]

# Rest is the same as before
set victim [clock format $tomorrow -format "%a"]
set tomorrow [clock format $tomorrow -format "%m%d%H%M"]
send "sudo date $tomorrow\r"

(你知道一天永远不会长 86600 秒吗?这比平均长度长 200 秒……)

于 2012-06-15T08:21:22.027 回答
2

正如您所发现的,时钟命令在 Tcl 8.4 和 8.5 之间发生了变化。在 8.4 中,时钟扫描命令只能识别一些标准格式。因此,您需要将您的 $today 值转换为其中一种格式,请参阅此处了解详细信息。

一种可能的方法是

regexp {(\d\d\d\d) (\d\d) (\d\d) (\d\d) (\d\d) (\d\d)} $today all YY MM DD HH mm ss
set reformatToday "$YY$MM$DD $HH$mm$ss"
set today [clock scan $reformatToday]

Tcl 8.5 也可以使用这种自由格式的扫描码;但是,此功能在 8.4 之后的 Tcl 版本中已被弃用。

于 2012-06-15T07:28:08.650 回答