从例子学习Perl的system函数

从例子学习Perl的system函数

例子1

避免:
system("chown $user.sgd newdata.txt");
推荐:
system("/usr/bin/chown $user:sgd newdata.txt");
system("/usr/ucb/chown $user.sgd newdata.txt");

理由:如果不是绝对路径,那么不同的用户执行脚本的时候,由于环境不一样,命令可能不一样。此外,由于没有指定绝对路径,会有安全隐患。

例子2

避免:
if (!system("$sub_script $user $file")) {
    print "success!\n";
}
推荐:
if (system("$sub_script $user $file") == 0) {
    print "success!\n";
}

理由:system函数的返回值低8位存Unix Signal,高位存命令执行的返回值,因此,如果需要判断shell命令是否执行成功,必须判断返回的值是否为0.

例子3

避免:
system("rm $dir/orf_geneontology.tmp");
system "mkdir $tempDir";
system("/bin/kill -HUP $pid");
推荐:
unlink("$dir/orf_geneontology.tmp");
mkdir $tempDir;
$number_killed = kill('HUP', $pid);

理由:尽量使用Perl内置的函数。

例子4

推荐:
open(PS, "/usr/bin/ps -aux |");
while (<PS>) { print } # process the output of ps command one line at a time
close(PS);
This is generally preferable to creating a temporary file with the output and reading it back in:
避免:
my $temporary_file = "/tmp/ps_output$$";
system("/usr/bin/ps -aux > $temporary_file");
open(PS, $temporary_file);
while (<PS>) { print } # process the output of ps command one line at a time
close(PS);
unlink($temporary_file);

理由:第一种写法更加简洁,更加Perl!

exec函数从来不返回(相当于重新执行了一个新的程序),因此很少使用。

    原文作者:zczhuohuo
    原文地址: https://www.jianshu.com/p/1493c81b3b07
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞