使用cygwin 32bit,期待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.
场景是,前四个参数是固定的。然后可能会有一些可变数量的命令,我希望这些命令可以作为一个命令来执行。如果我只使用[lindex argv 4]
,我只会获得signBinaries
脚本名称,无论它是否用引号括起来。使用lrange
(通过谷歌搜索找到),它将字符串参数括在大括号中,如图所示。为什么要以这种方式修改我的参数?如何修复它以便$COMMAND
包含我想要的命令?
答案 0 :(得分:1)
在期望扩展的Tcl中,您必须知道变量的数据类型:它是字符串还是列表?当列表被字符串化时,如果它们包含“元字符”(如反斜杠和大括号),它可以引用它的一些元素。
在大多数情况下,当您想要将列表内容用作单个字符串时,最好自己进行字符串化:
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\
答案 1 :(得分:0)
啊哈!想出来了:
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"