系统命令与Perl子程序

时间:2012-04-21 06:06:53

标签: perl rhel5

我有以下代码片段,我每天都会作为几个工作的一部分运行:

  system("cp $keyFile  $destinationFile");
  system("chown $userID $destinationFile");
  system("chmod 400 $destinationFile");

上述代码的问题在于,有时很少,上述操作中的至少一个操作无法成功完成,我的工作失败。如果上述操作之一失败,作业失败是正常的,我仍然希望避免失败的简单系统命令之一。

所以我有以下选择:

  1. 使用Perl子例程File::Copy::copychmodchown代替系统命令。
  2. 检查system()命令的返回值。我已经这样做了,但没有解释为什么它会失败。
  3. 使用Perl子例程而不是系统命令更好/更安全。我的工作将始终 RHEL5 计算机上运行[从不Windows]。

    我还能做些什么。如何收集有关出错的更多信息?

    更新:文件名或文件路径永远不会包含空格或奇怪的字符。它们来自集合[a-zA-Z]。

1 个答案:

答案 0 :(得分:4)

是的,使用Perl原生版本(File::Copychmod())总是更好。

有很多原因:

  • 性能。调用system()分支1到2个新进程(一个用于命令,可能另一个用于shell)这是一个繁重的操作

  • 错误检查。发生错误时,Perl中与IO相关的系统调用设置了"$!"错误文本变量:

    File::Copy::copy($source, $destination)
        || die "Failed to copy from $source to $destination. Error: $!\n";