2

我有一个 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 模块的解决方案。

4

4 回答 4

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 $!;

一旦你知道它失败的原因,你就可以弄清楚如何修复它。如果不是,则将错误消息添加到您的问题中。

于 2010-08-23T15:48:31.787 回答
1

尝试添加一些错误处理,例如之后stat

if ($!) {
   warn "WRN: $path/$directory: $!";
   next;
}

如果您的脚本需要很长时间才能运行,则某些目录(和文件)可能会被用户(或后台作业)移动/删除。

于 2010-08-23T15:50:04.893 回答
1

您还可以使用以下方法测试文件/目录是否归当前用户所有-o

于 2010-08-23T16:57:47.907 回答
0

stat DIRHANDLE 是一个相当新的功能,如果我没记错的话,并不是在每个平台上都可用...你确定你的 perl 支持它吗?

您可能希望首先专注于让 stat EXPR 为您工作。

于 2010-08-23T16:10:40.700 回答