如何在expect shell脚本中获取生成进程的退出代码?

ANR*_*ANR 20 unix linux bash shell expect

我正在尝试执行一个执行EXPECT脚本的脚本和一个包含退出代码的衍生进程.但我无法将生成的进程的退出代码获取到主脚本.我总是因为成功而获得零.

期望脚本是:

 [Linux Dev:anr ]$ cat testexit.sh
 #!/bin/bash
 export tmp_script_file="/home/anr/tmp_script_temp.sh"
 cp /home/anr/tmp_script $tmp_script_file
 chmod a+x $tmp_script_file
 cat $tmp_script_file
 expect << 'EOF'
 set timeout -1
 spawn  $env(tmp_script_file)
 expect {
 "INVALID "  { exit 4 }
 timeout     { exit 4 }
 }
 EOF
 echo "spawned process status" $?
 rm -f $tmp_script_file
 echo "done"
Run Code Online (Sandbox Code Playgroud)

产生的脚本:

 [Linux Dev:anr ]$ cat tmp_script
 exit 3
Run Code Online (Sandbox Code Playgroud)

执行Expect脚本:

 [Linux Dev:anr ]$ ./testexit.sh
 exit 3
 spawn /home/anr/tmp_script_temp.sh
 spawned process status 0
 done
Run Code Online (Sandbox Code Playgroud)

问题是我无法获得生成的退出返回代码以期望脚本.我希望生成的脚本的退出代码3到主脚本,主脚本应该退出,退出代码为3.

请帮我将生成的退出代码导入主脚本.

gle*_*man 33

您可以使用以下wait命令获取生成进程的退出状态:

expect <<'END'
log_user 0
spawn sh -c {echo hello; exit 42}
expect eof
puts $expect_out(buffer)

lassign [wait] pid spawnid os_error_flag value

if {$os_error_flag == 0} {
    puts "exit status: $value"
} else {
    puts "errno: $value"
}
END
Run Code Online (Sandbox Code Playgroud)
hello

exit status: 42
Run Code Online (Sandbox Code Playgroud)

来自期待的手册页

[args]

延迟直到生成的进程(或当前进程,如果没有命名)终止.

等待通常会返回一个包含四个整数的列表.第一个整数是等待进程的pid.第二个整数是相应的spawn id.如果发生操作系统错误,则第三个整数为-1,否则为0.如果第三个整数为0,则第四个整数是生成进程返回的状态.如果第三个整数是-1,则第四个整数是操作系统设置的errno的值.全局变量errorCode也已设置.


更改

expect {
"INVALID "  { exit 4 }
timeout     { exit 4 }
}
Run Code Online (Sandbox Code Playgroud)

expect {
    "INVALID "  { exit 4 }
    timeout     { exit 4 }
    eof
}
Run Code Online (Sandbox Code Playgroud)

然后添加lassignif命令.

  • 你的期望必须很旧.请改用:`foreach {pid spawnid os_error_flag value} [wait] break` (3认同)

ANR*_*ANR 12

在glenn的帮助下,我得到了解决方案..我的最终脚本是::

期待脚本是

 [Linux Dev:anr ]$ cat testexit.sh
 #!/bin/bash
 export tmp_script_file="/home/anr/tmp_script_temp.sh"
 cp /home/anr/tmp_script $tmp_script_file
 chmod a+x $tmp_script_file
 cat $tmp_script_file
 expect << 'EOF'
 set timeout -1
 spawn  $env(tmp_script_file)
 expect {
 "INVALID "  { exit 4 }
 timeout     { exit 4 }
 eof
 }

 foreach {pid spawnid os_error_flag value} [wait] break

 if {$os_error_flag == 0} {
     puts "exit status: $value"
     exit $value
 } else {
     puts "errno: $value"
     exit $value
 }
 EOF
 echo "spawned process status" $?
 rm -f $tmp_script_file
 echo "done"
Run Code Online (Sandbox Code Playgroud)

产生的脚本:

 [Linux Dev:anr ]$ cat tmp_script
 exit 3
Run Code Online (Sandbox Code Playgroud)

执行Expect脚本:

 [Linux Dev:anr ]$ ./testexit.sh
 exit 3
 spawn /home/anr/tmp_script_temp.sh
 exit status: 3
 spawned process status 3
 done
Run Code Online (Sandbox Code Playgroud)

再次感谢格伦

  • 您可以表达您的感谢:http://stackoverflow.com/help/someone-answers (9认同)