我有以下代码片段,我每天都会作为几个工作的一部分运行:
system("cp $keyFile $destinationFile");
system("chown $userID $destinationFile");
system("chmod 400 $destinationFile");
上述代码的问题在于,有时很少,上述操作中的至少一个操作无法成功完成,我的工作失败。如果上述操作之一失败,作业失败是正常的,我仍然希望避免失败的简单系统命令之一。
所以我有以下选择:
File::Copy::copy
,chmod
,chown
代替系统命令。system()
命令的返回值。我已经这样做了,但没有解释为什么它会失败。使用Perl子例程而不是系统命令更好/更安全。我的工作将始终在 RHEL5 计算机上运行[从不Windows]。
我还能做些什么。如何收集有关出错的更多信息?
更新:文件名或文件路径永远不会包含空格或奇怪的字符。它们来自集合[a-zA-Z]。
答案 0 :(得分:4)
是的,使用Perl原生版本(File::Copy
和chmod()
)总是更好。
有很多原因:
性能。调用system()
分支1到2个新进程(一个用于命令,可能另一个用于shell)这是一个繁重的操作
错误检查。发生错误时,Perl中与IO相关的系统调用设置了"$!"
错误文本变量:
File::Copy::copy($source, $destination)
|| die "Failed to copy from $source to $destination. Error: $!\n";