如何从glob运算符中捕获权限被拒绝的错误?

时间:2013-06-20 14:52:08

标签: linux perl bash

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

#!/bin/env perl

use strict;
use warnings;

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

print_dir @ARGV

2 个答案:

答案 0 :(得分:5)

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

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

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

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

use File::Glob qw(bsd_glob);
bsd_glob("*/*", File::Glob::GLOB_ERR);
print "Error globbing: $!\n" if (File::Glob::GLOB_ERROR);

答案 1 :(得分: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;