我正在编写一个Expect脚本,每次在AWS上生成新的服务器实例时从我们的dev服务器中提取最新的代码。我们的想法是,在创建新服务器时,脚本在启动之前运行,然后放在负载均衡器之后。它完美无缺,除非Git因冲突而中止。这是迄今为止的代码:
#!/usr/bin/expect -f
set timeout 240
spawn /xyz/pullfromdev
expect "*?assphrase*"
send -- "<mypass>\r"
expect {
"Aborting" {
set response $expect_out(buffer)
set format [split $response "\n"]
cd /var/www/html
foreach line $format {
if { !([string range $line 0 8] == "Identity " || [string range $line 0 8] == "Updating " || [string range $line 0 5] == "error:" || [string range $line 0 6] == "Please," || [string range $line 0 7] == "Aborting" || [string length $line] == 1 ) } {
open "| git checkout -- [string trim $line]"
}
}
spawn /xyz/pullfromdev
expect "*?assphrase*"
send -- "<mypass>\r"
}
}
expect eof
基本上我正在拆分输出缓冲区并尝试为每个有冲突的文件运行git checkout -- <filename>
。然后试图再次拉动,希望成功完成。
问题在于:
open "| git checkout -- [string trim $line]"
它显然不会执行任何操作,我也不会收到任何错误。该脚本试图从开发服务器再次拉出并中止,因为没有发生git checkout并且冲突仍然存在。 TCL对我来说有点陌生,所以它可能是一个语法问题?我尝试过spawn和exec,但它们似乎也没有用。冲突仍然存在,git中止。
但是,如果我通过命令行运行git checkout -- <filename>
,那么该特定文件不再发生冲突(因为实际发生了结账)。所以问题实际上是让git checkout命令从Expect脚本运行,我无法以某种方式进行。
有没有人有任何建议?
如果它有帮助,这是在CentOS 5上,代码中引用的'pullfromdev'脚本就是:
#!/bin/bash
cd /var/www/html
ssh-agent bash -c 'ssh-add /xyz/<identity>; git pull'
答案 0 :(得分:1)
您不能使用==来比较TCL中的字符串。试试string compare或regexp命令。
答案 1 :(得分:1)
打开管道时,除第一个字符外的所有内容都是Tcl参数列表(第一个|
是特殊的)。这意味着你应该使用它:
open |[list git checkout -- [string trim $line]]