Wak*_*nka 4 bash arguments expect argument-passing command-line-arguments
如果有人想从Bash调用外部程序(它作为Bash参数传递)并传递命令行选项(也作为Bash参数传递),解决方案很简单:
TCL_SCRIPT="$1"
shift
TCL_SCRIPT_ARGUMENTS="$@"
expect -f "$TCL_SCRIPT" "$TCL_SCRIPT_ARGUMENTS" 2>&1
Run Code Online (Sandbox Code Playgroud)
在TCL/Expect中有类似的可能性吗?
编辑:到目前为止,我已经来了这个黑客(评论中有Bash等价物),似乎它正在运作.有人可以解释lshift程序吗?
# http://wiki.tcl.tk/918#pagetocc7993a2b
proc lshift {inputlist} {
upvar $inputlist argv
set arg [lindex $argv 0]
#set argv [lrange $argv 1 end] ;# below is much faster - lreplace can make use of unshared Tcl_Obj to avoid alloc'ing the result
set argv [lreplace $argv[set argv {}] 0 0]
return $arg
}
# BASH: TCL_SCRIPT="$1"
set script [lindex $argv 0]
# BASH: shift
lshift argv
# BASH: TCL_SCRIPT_ARGUMENTS="$@"
set arguments $argv
Run Code Online (Sandbox Code Playgroud)
gle*_*man 12
从字面上翻译你的例子
set program [lindex $argv 0]
set arguments [lrange $argv 1 end]
spawn $program {*}$arguments
Run Code Online (Sandbox Code Playgroud)
{*}是Tcl的"列表扩展"语法(Tcl的12条语法规则的第5条).它将列表拆分为当前命令中的元素.
如果$argv是foo bar baz,那么
spawn [lindex $argv 0] [lrange $argv 1 end]
Run Code Online (Sandbox Code Playgroud)
将foo使用1个参数调用:"bar baz"
spawn [lindex $argv 0] {*}[lrange $argv 1 end]
Run Code Online (Sandbox Code Playgroud)
将foo使用2个参数调用:"bar"和"baz"
切向,我会lshift像这样编码你的proc:
proc lshift {varname} {
upvar 1 $varname var
set var [lassign $var first]
return $first
}
Run Code Online (Sandbox Code Playgroud)
然后:
expect1.6> set argv {foo bar baz}
foo bar baz
expect1.7> set script [lshift argv]
foo
expect1.8> set script
foo
expect1.9> set argv
bar baz
Run Code Online (Sandbox Code Playgroud)