2013-06-20 2 views
5

Следующий простой скрипт Perl отобразит содержимое каталога с каталогом, указанным в качестве аргумента скрипту. Как в системе Linux я могу захватить отклоненные разрешения? В настоящее время, если этот скрипт запущен в каталоге, в котором у пользователя нет прав на чтение, в терминале ничего не происходит.Как получить доступ к разрешенным ошибкам оператора glob?

#!/bin/env perl 

use strict; 
use warnings; 

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

print_dir @ARGV 
+0

То, о чем вы просите, было бы атипичным поведением из 'glob'. 'stat' может сказать вам, есть ли у вас доступ к каталогу. –

+0

Я понимаю, что glob не знает прав пользователя, но я предполагаю, что оболочка возвращает ошибку скрипту, но не печатается, это неправильно? Меня интересует, как поймать ошибку из оболочки и распечатать ее. – GL2014

+0

Я понял, что вы имеете в виду сейчас, я просто попробовал echo/root/*, и он не возвращает ошибку в оболочке. Спасибо. – GL2014

ответ

5

glob функция не имеет большого контроля ошибок, за исключением того, что $! устанавливается, если последний Глоб терпит неудачу:

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

Если Глоб удается найти что-то позже, не будет установлен $!, хоть. Например, 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); 
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;