从例子学习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函数从来不返回(相当于重新执行了一个新的程序),因此很少使用。