2015-05-13 65 views
2

我有一個期望例程,它需要產生一個進程並將傳遞給期望例程的命令行參數傳遞給產生的進程。使用argc和argv分析命令行

我期待例程有以下行

spawn myProcess $argv 

,當我打電話給我的期望例行我把它叫做命令行如下

​​

當我這樣做,希望拋出以下錯誤

Can't open input file <arg1> <arg2> <arg3> for reading 

但是,如果我改變我的預期程序如下

spawn myProcess [lindex $argv 0] [lindex $argv 1] [lindex $argv 2] 

myProcess生成沒有任何錯誤。然而,這對我沒有用,因爲我不能保證我總是有三個參數傳遞給期望例程。

如何將命令行參數從unix shell的命令行傳遞給生成的進程?

+1

......問題在哪裏? –

回答

3

如果您不確定要傳遞的參數的數量,那麼可以使用eval或參數擴展運算符{*}

如果您Tcl的版本是8.5或以上,

spawn <program-name> {*}$argv 

否則,

eval spawn <program-name> $argv 

讓我們考慮以下Tcl程序

cmdlinearg.tcl

#!/usr/bin/tclsh 

set count 0; 
if { $argc == 0 } { 
     puts "No args passed :(" 
     exit 1 
} 
foreach arg $argv { 
     puts "$count : $arg" 
     incr count 
} 
puts "THE END" 

該程序將接收任意數量的命令行參數。要運行這個程序,我們在shell

[email protected]:~/stackoverflow$ tclsh cmdlinearg STACK OVER FLOW 

,這將給輸出

0 : STACK 
1 : OVER 
2 : FLOW 
THE END 

現在執行下面的命令,讓我們寫一個詳細計劃,將與任意數量的命令沿產卵這個節目線參數。

MyProgram.tcl

#!/usr/bin/expect 

# If your Tcl version is 8.4 or below 
eval spawn tclsh $argv 
expect eof 
# If your Tcl version is 8.5 or above 
spawn tclsh {*}$argv 
expect eof 

如果假設你想通過你的程序的名字本身作爲一個參數,這也是可能的。

# Taking the first command line arg as the program name and 
# using rest of the args to the program 
eval spawn [lindex argv 0] [ lrange $argv 0 end ] 
expect eof 
+0

參數擴展操作符像一個魅力一樣工作。還有什麼地方會使用參數展開操作符? – Prashant

+0

它可以用於任何需要參數擴展的地方。看看[wiki](http://wiki.tcl。tk/17158)和[SO](http://stackoverflow.com/questions/5124185/what-does-do-in-tcl)頁面。 – Dinesh