无法将多个命令行参数接受到 expect 中的一个变量中
Unable to accept multiple commandline arguments into one variable within expect
使用 cygwin 32 位,期望 v5.45(似乎是最新的 cygwin 附带的)。
COMMAND="$WIN_BUILD_ROOT\scripts\signBinaries.bat $BUS $NET_DRIVE $WIN_SIGNING_ROOT"
$CLIENT_BUILD_ROOT/scripts/runCommand.sh $arg1 $arg2 $arg3 $arg4 $COMMAND
runCommand.sh:
#!C:\cygwin\bin\expect.exe -f
set timeout 9
set arg1 [lindex $argv 0]
set arg2 [lindex $argv 1]
set arg3 [lindex $argv 2]
set arg4 [lindex $argv 3]
set COMMAND [lrange $argv 4 end]
send -- "$COMMAND\r"
给我:
{s:\git\builds\scripts\signBinaries.bat} 64 s {s:\git\builds\}
The filename, directory name, or volume label syntax is incorrect.
场景是,前四个参数是固定的。然后可能会有数量可变的命令,我希望这些命令作为一个命令由 expect 执行。如果我只使用 [lindex argv 4]
,我只会得到 signBinaries
脚本名称,无论它是否包含在引号中。相反,使用 lrange
(通过谷歌搜索找到),它将字符串参数括在大括号中,如图所示。为什么它会以这种方式修改我的参数以及如何修复它以便 $COMMAND
包含我想要的命令?
啊哈!想通了:
set COMMAND [join [lrange $argv 4 end]]
给我:
s:\git\builds\scripts\signBinaries.bat 64 s s:\git\builds
"BUS: 64"
"DRIVE: s"
"WORKSPACE: s:\git\builds"
在期望扩展的Tcl 中,您必须了解变量的数据类型:它是字符串还是列表?当一个列表被字符串化时,如果它们包含 "metacharacters"(如反斜杠和大括号),它可能会引用它的一些元素。
在大多数情况下,当您想将列表的内容用作单个字符串时,最好自己将其字符串化:
set COMMAND [list "s:\git\builds\scripts\signBinaries.bat" 64 s "s:\git\builds\"]
puts $COMMAND
# => {s:\git\builds\scripts\signBinaries.bat} 64 s s:\git\builds\
puts [join $COMMAND " "]
# => s:\git\builds\scripts\signBinaries.bat 64 s s:\git\builds\
使用 cygwin 32 位,期望 v5.45(似乎是最新的 cygwin 附带的)。
COMMAND="$WIN_BUILD_ROOT\scripts\signBinaries.bat $BUS $NET_DRIVE $WIN_SIGNING_ROOT"
$CLIENT_BUILD_ROOT/scripts/runCommand.sh $arg1 $arg2 $arg3 $arg4 $COMMAND
runCommand.sh:
#!C:\cygwin\bin\expect.exe -f
set timeout 9
set arg1 [lindex $argv 0]
set arg2 [lindex $argv 1]
set arg3 [lindex $argv 2]
set arg4 [lindex $argv 3]
set COMMAND [lrange $argv 4 end]
send -- "$COMMAND\r"
给我:
{s:\git\builds\scripts\signBinaries.bat} 64 s {s:\git\builds\}
The filename, directory name, or volume label syntax is incorrect.
场景是,前四个参数是固定的。然后可能会有数量可变的命令,我希望这些命令作为一个命令由 expect 执行。如果我只使用 [lindex argv 4]
,我只会得到 signBinaries
脚本名称,无论它是否包含在引号中。相反,使用 lrange
(通过谷歌搜索找到),它将字符串参数括在大括号中,如图所示。为什么它会以这种方式修改我的参数以及如何修复它以便 $COMMAND
包含我想要的命令?
啊哈!想通了:
set COMMAND [join [lrange $argv 4 end]]
给我:
s:\git\builds\scripts\signBinaries.bat 64 s s:\git\builds
"BUS: 64"
"DRIVE: s"
"WORKSPACE: s:\git\builds"
在期望扩展的Tcl 中,您必须了解变量的数据类型:它是字符串还是列表?当一个列表被字符串化时,如果它们包含 "metacharacters"(如反斜杠和大括号),它可能会引用它的一些元素。
在大多数情况下,当您想将列表的内容用作单个字符串时,最好自己将其字符串化:
set COMMAND [list "s:\git\builds\scripts\signBinaries.bat" 64 s "s:\git\builds\"]
puts $COMMAND
# => {s:\git\builds\scripts\signBinaries.bat} 64 s s:\git\builds\
puts [join $COMMAND " "]
# => s:\git\builds\scripts\signBinaries.bat 64 s s:\git\builds\