2017-07-18 1 views
2

Ich erzeuge ein paar Variablen in meinem tcl-Skript, die tatsächlich als Schalter für ein Perl-Skript verwendet werden.Wie Schalter für ein Perl-Skript übergeben werden, das von tcl mit exec ausgeführt wird

meine Schalter sind -X, -Y und -Z, ich speichern sie in einer Variablen, cmd mit set cmd "-X -Y -Z"

Ich verwende exec das Perl-Skript in tcl wie folgt auszuführen:

exec ./script.pl $cmd 

die wirft ein Fehler: "Error: Unknown option x -y -z"

dann habe ich einen anderen Weg versucht:

Für diesen speziellen Fall wird das Perl-Skript ausgeführt, aber ohne die Schalter, d. H. Schalter werden nicht aktiviert.

Gibt es eine Möglichkeit, dies zu beheben?

+1

Ich vermute, Ihre Shell analysiert '-X -Y -Z 'als * one * -Flag, Sie müssen sie in drei separate Argumente aufteilen. –

Antwort

3
set cmd "-X -Y -Z" 

Erstellt eine einzelne Zeichenfolge mit -X -Y -Z darin. Wenn Sie den Befehl exec mit exec ./script.pl $cmd aufrufen, übergeben Sie ein einzelnes Argument mit -X -Y -Z. Was Sie wollen, sind drei separate Argumente. Der beste Weg, dies zu tun ist:

exec ./script.pl {*}$cmd 

Der {*} Betreiber erweitert eine Liste in seine Einzelwörter.

Dies ist sehr nützlich.

set cmd {} 
lappend cmd -X 
if { $mytest eq "true" } { 
    lappend cmd -Y 
} 
lappend cmd -Z 
if { $filename ne {} } { 
    lappend cmd -f 
    lappend cmd $filename 
} 
exec ./script.pl {*}$cmd 

Bei älteren Versionen von Tcl, der eval Befehl verwendet werden:

eval exec ./script.pl $cmd 

bearbeiten: Sie können Ihre Argumentliste mit Code ähnlich (Beispiel) aufzubauen - Argument exec

-- Das Argument exec gibt an, dass keine weiteren Schalter (Optionen) wird von exec geparst werden. Dies ermöglicht die Verwendung von exec für die Fälle, in denen ein Befehl mit einer - beginnt. z.B.

exec -- -myweirdcommand 

Referenzen: Tcl Syntax (#5); eval; exec

+0

Da ich eine ältere Version von TCL betreibe, hat die 2. Lösung für mich funktioniert. Die erste Lösung gab mir einen Fehler: zusätzliche Zeichen nach der nächsten geschweiften Klammer. Egal aus Neugier, ich wollte die Verwendung von "-" in exec wissen. Die manuelle Seite sagt, dass es das Ende der Schalter markiert. In welchem ​​speziellen Fall würde dies verwendet werden? Ich dachte, es wird das Ende der Schalter für exec markieren und Argumente für das Perl-Skript berücksichtigen, aber ich lag falsch. – Deepak

Verwandte Themen