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

GL2*_*014 5 linux bash perl

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

#!/bin/env perl

use strict;
use warnings;

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

print_dir @ARGV
Run Code Online (Sandbox Code Playgroud)

Jon*_*oni 5

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

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

如果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);
Run Code Online (Sandbox Code Playgroud)