我有一个执行少量命令然后telnet到机器的脚本。现在我需要从另一个perl脚本调用这个脚本。
$result = `some_script.pl`;
脚本some_script.pl成功执行,但是当脚本在telnet提示符处等待时,我无法退出主脚本。
我还需要捕获脚本的退出状态,以确保some_script.pl成功执行。
我无法修改some_script.pl。
在some_script.pl成功执行后,有什么方法可以让我退出吗?
答案 0 :(得分:0)
试试这个,这个'魔术'关闭标准输入/输出/错误并且可以让你的程序完成。
$ result =`some_script.pl>& - 2>& - <& - ';
否则你可以使用open2并期望在程序输出中查看特定字符串(如Done!)并在完成后关闭它。
http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod
此致
答案 1 :(得分:0)
我不喜欢您通过对系统进行“反引号”调用来实际执行perl脚本的方式。 我建议你实际上是fork(或类似的东西)并以更加可控的方式运行程序。
use POSIX ":sys_wait_h";
my $pid = fork();
if($pid) { # on the parent proc, $pid will point to the child
waitpid($pid); # wait for the child to finish
} else { # this is the child, where we want to run the telnet
exec 'some_script.pl'; # this child will now "become" some_script.pl
}
由于我不知道some_script.pl实际上是如何工作的,所以我在这里真的无法帮助你。但是,例如,如果您只需要在some_script.pl的命令行上打印“quit”,则可以使用IPC::Open2中建议的another question。做类似的事情:
use IPC::Open2;
$pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some_script.pl');
print CHLD_IN "quit\n";
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
你需要稍微调整一下,但这个想法可以解决你的问题。