2016-09-12 4 views
1

Es gibt tcl-Prozedur, die in tcl-Liste gespeicherten Befehl ausführt. Zum Beispiel:TCL exec mit Sonderzeichen in der Liste

catch { exec $list} 

Liste sieht etwa so aus:

--option1 op1 --option2 op2 --option3 op3 ... 

Eine der Optionen ist regexp, die wie folgt aussieht:

(.*[/\])?(sh|bash)(\.exe)? 

Nach Substitution durch exec Option wie folgt aussieht:

{(.*[/\])?(sh|bash)(\.exe)?} 

Aber was ich brauche, ist:

"(.*[/\])?(sh|bash)(\.exe)?" 

Was kann ich in einer solchen Situation tun?

Antwort

4

Wenn eine Liste in eine Zeichenfolge konvertiert wird, wird sie in eine kanonische Form konvertiert, die wieder in dieselbe Liste konvertiert wird.

Was Sie sehen, sind die Anführungszeichen, die verwendet werden, um sicherzustellen, dass die kanonische Form korrekt zurück konvertiert.

Also der Wert ist korrekt.

exec $list übergibt nur ein einzelnes Argument an exec. exec nimmt eine Reihe von Wörtern als Argumente, nicht eine Liste, die Wörter enthält.

Der sollte exec Befehl sein:

catch { exec {*}$list } 

{*} Die Syntax wandelt die Liste in seine Komponentenwörter.

In älteren Versionen von tcl, muss die eval-Anweisung verwendet werden:

catch { eval exec $list } 

Referenzen: exec, eval, {*} (section 5 of Tcl)

0
  1. exec wird commnad als subprocess auszuführen

  2. Siehe semples:

    funktioniert:

    exec ps aux | grep tclsh

    nicht funktioniert:

    exec "ps aux | grep tclsh"

    exec [list ps aux | grep tclsh]

    funktioniert aber einwandfrei:

    eval exec "ps aux | grep tclsh"

    eval exec [list ps aux | grep tclsh]

Also haben wir vor dem Ausführen - creation command (exec ps aux | grep tclsh) evaluieren und aufrufen. So eval kümmert sich nicht um Typ.

  1. Für aktuelle Situation mit Optionen: exec someExecutable --option1 op1 --option2 op2 --option3 (.*[/\])?(sh|bash)(\.exe)?

Ich würde recoment solche Lösung:

set op3 {"(.*[/\])?(sh|bash)(\.exe)?"} 
lappend cmd [someExecutable --option1 op1 --option2 op2 --option3 $op3] 
set cmd [join $cmd] 
eval exec $cmd 

wo [join $cmd] Zeichenfolge aus der Liste erstellt - und ist es nicht alle { }

Verwandte Themen