1

以下に示すクロック操作は、TCL8.5を搭載したLinuxマシンでうまく機能します。しかし、TCL8.4を搭載したSunOSで同じものを使用すると、「bad switch "-format":must be-baseor-gmt」というエラーが発生します。

何らかの理由で、SunOSでTCL8.4を8.5にアップグレードできません。

TCL 8.4でも機能させるにはどうすればよいですか?

コマンドを以下に示します。これらのコマンドを使用して達成しようとしているのは、システムの日付をもう1日進めることです。

$todayには「20120615143920」という値が含まれています

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"

(1 日の長さが 86600 秒ではないことはご存知ですか?それは平均の長さよりも 200 秒長いのです…)

于 2012-06-15T08:21:22.027 に答える
2

ご存じのとおり、clock コマンドは Tcl 8.4 と 8.5 の間で変更されました。8.4 では、クロック スキャン コマンドは多くの標準フォーマットしか認識しませんでした。したがって、$today 値をこれらの形式のいずれかに変換する必要があります。詳細については、こちらを参照してください。

1つの可能な方法は

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 に答える