1

私はこの困難なコードの塊を持っています:

exec zip -r $FULLPATH error.log [ append datetime $RECENT ".bwdb" ] [ append txt $testName  ".txt" ] [ append lancap $testName "-lan.cap" ] \
        [ append lanmcap $testName "-lan-m.cap" ] [ append wancap $testName "-wan.cap" ] [ append wanmcap $testName "-wan-m.cap" ] [ append conf $confFile ".conf" ] \
        start.txt start-lan.cap start-lan-m.cap start-wan.cap start-wan-m.cap [ append comments "comments-" $RECENT ".bwc" ]

実際には、一連のファイルをまとめて圧縮しているだけです。zip ファイルの生成方法を変更しています (より正確には、生成に変更しています)。私が決めた方法は、すべてのコマンドをテキスト ファイルに保存し、作成する必要があるときにファイル内のすべてのコマンドを実行することです。問題は、リテラル形式に変換する必要がある変数がたくさんあることです。

このコマンドをリテラル値に変換してテキスト ファイルに保存する方法を知っている人はいますか?

編集:同じ問題を解決する他の提案、および/または私が提案している方法でそれを行う際の長所/短所も喜んで聞きます。

Edit2:すべての助けをありがとう、私はこれを行うことにしました:

set data123 "exec zip -r $FULLPATH error.log [ append datetime $RECENT \".bwdb\" ] [ append txt $testName  \".txt\" ] [ append lancap $testName \"-lan.cap\" ] \
        [ append lanmcap $testName \"-lan-m.cap\" ] [ append wancap $testName \"-wan.cap\" ] [ append wanmcap $testName \"-wan-m.cap\" ] [ append conf $confFile \".conf\" ] \
        start.txt start-lan.cap start-lan-m.cap start-wan.cap start-wan-m.cap [ append comments \"comments-\" $RECENT \".bwc\" ]"

set datafile123 "datafile123.txt"
set fileId123 [ open $datafile123 "w" ]
puts $fileId123 $data123
close $fileId123

ただし、結果のファイルを見ると、次のように表示されます。

exec zip -r /home/IOL/TR069_Certification/Results/TEST_Round99_GetRPCMethods_CDR1_20130410172812 error.log 20130410172812.bwdb20130410172812".bwdb" GetRPCMethods.txtGetRPCMethods".txt" GetRPCMethods-lan.capGetRPCMethods"-lan.cap"  GetRPCMethods-lan-m.capGetRPCMethods"-lan-m.cap" GetRPCMethods-wan.capGetRPCMethods"-wan.cap" GetRPCMethods-wan-m.capGetRPCMethods"-wan-m.cap" IOL.confIOL".conf"  start.txt start-lan.cap start-lan-m.cap start-wan.cap start-wan-m.cap comments-20130410172812.bwc"comments-"20130410172812".bwc"

各追加の最後に連結された文字列の2番目のコピーを作成しているように見えますが、その理由はわかりません。

4

2 に答える 2

2

単純な文字列ではないのはなぜですか?"文字列が複数の行にまたがることができることをご存知ですか?

set f [open /p/t/f w]
puts $f "error.log
$datetume$RECENT.bwdb
$txt$testName.txt
$lancap$testName-lan.cap
$lanmcap$testName-lan-m.cap
$wancap$testName-wan.cap
$wanmcap$testName-$wan.cap
$conf$confFile.conf
start.txt
start-lan.cap
start-lan-m.cap
start-wan.cap
start-wan-m.cap
${comments}comments-$RECENT.bwc"
close $f

編集:フォローアップ行をインデントしないでください。そうしないと、このインデントが結果のファイルに表示されます。
私は通常、テンプレート ファイルを使用substし、変数を置き換えるために使用します。

于 2013-04-09T18:45:46.333 に答える
0

私は基本的にあなたが提案したことをするだけです:リテラル値をテキストファイルに書きました。これを行う 1 つの方法は、次のように簡単です。

set s ""
append s \
  error.log \n \
  $datetime $RECENT .bwdb \n \
  $txt $testName .txt \n \
  $lancap $testName -lan.cap \n \
  $lanmcap $testName -lan-m.cap \n \
  $wancap $testName -wan.cap \n \
  $wanmcap $testName -wan-m.cap \n \
  $conf $confFile .conf \n \
  start.txt \n start-lan.cap \n \
  start-lan-m.cap \n start-wan.cap \n start-wan-m.cap \n \
  $comments comments- $RECENT .bwc
set f [open /path/to/file w]
puts $f $s
close $f

これにより、1 行に 1 つのファイル名を持つテキスト ファイルが作成されます。

別の — より直接的な — リワークは次のようになります。

set files [list]
lappend files \
  error.log \
  [ append datetime $RECENT ".bwdb" ] \
  [ append txt $testName  ".txt" ] \
  [ append lancap $testName "-lan.cap" ] \
  [ append lanmcap $testName "-lan-m.cap" ] \
  [ append wancap $testName "-wan.cap" ] \
  [ append wanmcap $testName "-wan-m.cap" ] \
  [ append conf $confFile ".conf" ] \
  start.txt start-lan.cap start-lan-m.cap start-wan.cap start-wan-m.cap \
  [ append comments "comments-" $RECENT ".bwc" ]
set f [open /path/to/file w]
puts $f [join $files \n]
close $f

appendここでは、このコマンドは副作用のためだけに使用されているようですが、この使用法については疑わしいです。append2 番目から最後の引数の文字列を取得し、最初の引数として名前が渡された変数にある文字列にそれらを追加し、結果の文字列を返します。そして、あなたの元の例(および私の2番目の例)では、appendその戻り値のためだけに使用されているように見えるという事実が嫌いです。

したがって、おそらくより慣用的な方法は、次のように、単純な文字列連結の Tcl の方法を使用することです。

set files [list]
lappend files \
  error.log \
  ${datetime}${RECENT}.bwdb \
  ${txt}${testName}.txt \
  ${lancap}${testName}-lan.cap \
  ${lanmcap}${testName}-lan-m.cap \
  ${wancap}${testName}-wan.cap \
  ${wanmcap}${testName}-wan-m.cap \
  ${conf}${confFile}.conf \
  start.txt start-lan.cap start-lan-m.cap start-wan.cap start-wan-m.cap \
  ${comments}comments-${RECENT}.bwc
set f [open /path/to/file w]
puts $f [join $files \n]
close $f
于 2013-04-09T18:34:43.120 に答える