如何在预期的shell脚本中获得产生的进程的退出代码?

我试图执行一个脚本,执行一个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" 

衍生的脚本:

  [Linux Dev:anr ]$ cat tmp_script exit 3 

Expect脚本的执行:

  [Linux Dev:anr ]$ ./testexit.sh exit 3 spawn /home/anr/tmp_script_temp.sh spawned process status 0 done 

问题是我无法得到产生的退出代码期望脚本。 我希望产生的脚本的退出代码3到主脚本,主脚本应该退出,退出代码3。

请帮我把产生的退出代码到主脚本。

你可以用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 
 hello exit status: 42 

从期望的男人页面

等待[args]

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

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


更改

 expect { "INVALID " { exit 4 } timeout { exit 4 } } 

 expect { "INVALID " { exit 4 } timeout { exit 4 } eof } 

然后添加lassignif命令。

在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" 

衍生的脚本:

  [Linux Dev:anr ]$ cat tmp_script exit 3 

Expect脚本的执行:

  [Linux Dev:anr ]$ ./testexit.sh exit 3 spawn /home/anr/tmp_script_temp.sh exit status: 3 spawned process status 3 done 

再次感谢Glenn ..