我有一个perl脚本,它将对目录执行一些操作,我只等它在当前用户(例如执行脚本的用户)拥有所有权的目录上运行。
我尝试了以下内容:
...
my $user = getlogin();
opendir(HANDLE, $path) or die ("No such directory: $path");
foreach my $directory (readdir HANDLE)
{
opendir(WORKING_DIR_HANDLE, "$path/$directory") or die ("!!!!!!!");
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat(WORKING_DIR_HANDLE);
my $owner = getpwuid($uid);
if( $owner eq $user )
{
...
}
}
...
代码在很大程度上起作用。但是,对stat()的调用返回未定义的值。根据perl文档,我认为我正在调用stat():
* stat FILEHANDLE
* stat EXPR
* stat DIRHANDLE
* stat
Returns a 13-element list giving the status info for a file, either the file opened via
FILEHANDLE or DIRHANDLE, or named by EXPR. If EXPR is omitted, it stats $_ . Returns the
empty list if stat fails. Typically used as follows:
我还尝试使用文件名将其设为EXPR,我得到了相同的结果。我只是缺少一些明显的东西吗?或者还有另一种方法吗?我更喜欢不需要安装第三方perl模块的解决方案。
答案 0 :(得分:3)
stat
在失败时返回一个空列表,它将所有这些变量设置为undef。在通话结束后添加or die $!
以找出失败的原因:
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)
= stat(WORKING_DIR_HANDLE) or die $!;
一旦你知道它失败的原因,你就可以弄清楚如何修复它。如果没有,请将错误消息添加到您的问题中。
答案 1 :(得分:1)
尝试添加一些错误处理,例如在stat
之后:
if ($!) {
warn "WRN: $path/$directory: $!";
next;
}
如果您的脚本需要很长时间才能运行,那么用户(或后台作业)可能会移动/删除某些目录(和文件)。
答案 2 :(得分:1)
您还可以使用-o
答案 3 :(得分:0)
stat DIRHANDLE是一个相当新的功能,如果我没记错在每个平台都没有...你确定你的perl支持吗?
您可能希望首先专注于让EXPR正在为您工作。