在 Perl 中用 system、exec、readpipe 函数来执行系统命令
文章目录
在 Perl 脚本中,允许调用系统的命令来进行操作。这就是 Perl 灵活性的体现,作为一种系统命令的粘合语言,能给程序员带来许多的便利。这样,你就可以最大限度地利用别人的成果,用不着自己使劲造轮子了。
在 Perl 中,可以用 system、exec、readpipe 这三个命令来调用其他脚本、系统命令等。这三个命令的主要区别就是返回值。
- 对于 system这个函数来说,它会返回执行后的状态,比如说
@args = (“command”, “arg1”, “arg2”); system(@args) == 0 or die “system @args failed: $?"
当然,你也可以用类似于下面的语句来检查出错的原因:
<pre><span style="color: #8ac6f2;font-weight: bold">if</span> ($? == -1) {
print <span style="color: #95e454">"failed to execute: $!\n"</span>;
} elsif ($? & 127) { printf “child died with signal %d, %s coredump\n”, ($? & 127), ($? & 128) ? ‘with’ : ‘without’; } else { printf “child exited with value %d\n”, $? >> 8; }
-
而对于 exec 这个函数来说,仅仅是执行一个系统的命令,一般情况下并没有返回值。exec只有在系统没有你要执行的命令的情况下,才会返回 false 值。
exec (‘foo’) or print STDERR “couldn’t exec foo: $!"; { exec (‘foo’) }; print STDERR “couldn’t exec foo: $!";
-
当我们需要保存系统命令运行的结果,以便分析并作进一步的处理时,就要用到 readpipe这个函数了。例如:
@result = readpipe(“ls -l /tmp”); print "@result”;
会产生如下的结果:
<pre>drwxr-xr-x 2 root root 4096 Mar 19 11:55 testdir</pre>
当然,你也可以把生成的结果放到一个文件里,以便写工作日志呀、发布报告呀。
<pre>$<span style="color: #cae682">inject_command</span> = <span style="color: #95e454">"./ConfigChecker.bat F:/test/etc "</span>.$<span style="color: #cae682">device_name</span>;
chdir “F:/TestTools/bin/"; @temp_result = readpipe($inject_command); open(result_file,">result.txt”); print result_file @temp_result; close(result_file);
这样,你就把系统运行的结果扔到了系统命令所在目录下的 result.txt 文件里了。</li> </ol>
这三个命令,有各自的特点,需要在使用时灵活选用,更详细的资料就得上 [PerlDoc](http://perldoc.perl.org/) 上找了。
文章作者 cookwhy
上次更新 2008-10-10