TCL/Expect相当于Bash $ @或如何将参数传递给TCL/Expect中的生成进程

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条).它将列表拆分为当前命令中的元素.

如果$argvfoo 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)