5

以下简单的 Perl 脚本将列出目录的内容,并将目录列为脚本的参数。如何在 Linux 系统上捕获权限被拒绝错误?当前,如果此脚本在用户没有读取权限的目录上运行,则终端中不会发生任何事情。

#!/bin/env perl

use strict;
use warnings;

sub print_dir {
foreach ( glob "@_/*" )
  {print "$_\n"};
}

print_dir @ARGV
4

2 回答 2

5

glob函数没有太多的错误控制,除非$!最后一个 glob 失败时设置:

glob "A/*"; # No read permission for A => "Permission denied"
print "Error globbing A: $!\n" if ($!);

但是,如果 glob 稍后成功找到某些内容,$!则不会设置。例如glob "*/*",即使它无法列出目录的内容,也不会报告错误。

bsd_glob标准模块中的功能File::Glob允许设置标志以启用可靠的错误报告:

use File::Glob qw(bsd_glob);
bsd_glob("*/*", File::Glob::GLOB_ERR);
print "Error globbing: $!\n" if (File::Glob::GLOB_ERROR);
于 2013-06-20T15:53:02.903 回答
0

使用 File::Find,它是一个核心模块,能够控制文件上的所有内容。

#!perl
use 5.10.0;
use strict;
use warnings;
use File::Find;
find {
    wanted => sub {
        return if not -r $_; # skip if not readable
        say $_;
    },
    no_chdir => 1,
}, @ARGV;
于 2013-06-22T00:10:51.893 回答