2016-05-20 5 views
0

cygwin 32bitを使用するとv5.45が必要です(最新のcygwinに付属しているようです)。複数のコマンドライン引数を1つの変数に受け入れることができません

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. 

シナリオがあり、最初の4つの引数が固定されています。それから私は期待通りに実行される1つのコマンドとして、それらの後ろに可変数のコマンドを置くことができます。 [lindex argv 4]をちょうど使用すると、引用符で囲まれているかどうかにかかわらず、signBinariesのスクリプト名しか取得できません。代わりにlrange(グーグル検索)を使用すると、図のように、文字列引数を中括弧で囲んでいます。どうしてこの方法で私の議論を修正しているのですか?$COMMANDに私が意図したようなコマンドが含まれるように修正するには?

答えて

0

Aha!それを考え出した:あなたは、変数のデータ型を認識する必要があり、拡張を期待され、Tclで

s:\git\builds\scripts\signBinaries.bat 64 s s:\git\builds 
"BUS: 64" 
"DRIVE: s" 
"WORKSPACE: s:\git\builds" 
1

set COMMAND [join [lrange $argv 4 end]] 

が私を与えることは、文字列またはリストのですか?リストが文字列化されると、それらの要素に "メタキャラクタ"(バックスラッシュや中括弧など)が含まれている場合、その要素の一部を引用することがあります。多くの場合

あなたが1つの文字列として、リストの内容を使用したいとき、それはそれを自分で文字列化するのが最善です:

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\ 
関連する問題