我试图执行一个脚本,执行一个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 }
然后添加lassign
和if
命令。
在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 ..