2013-06-20 10 views
5

Poniższy prosty skrypt Perla wyświetli zawartość katalogu, a katalog zostanie wymieniony jako argument skryptu. Jak w systemie Linux mogę przechwytywać błędy odmowy uprawnień? Obecnie, jeśli skrypt jest uruchamiany w katalogu, do którego użytkownik nie ma uprawnień do odczytu, nic się nie dzieje w terminalu.Jak przechwycić błędy odmowy uprawnień od operatora globu?

#!/bin/env perl 

use strict; 
use warnings; 

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

print_dir @ARGV 
+0

To, o co prosisz, to nietypowe zachowanie z "globu". 'stat' może powiedzieć, czy masz dostęp do katalogu. –

+0

Rozumiem, że glob nie ma świadomości uprawnień użytkownika, ale zakładam, że powłoka zwraca błąd do skryptu, ale nie jest drukowany, czy to nie jest poprawne? Interesuje mnie, jak złapać błąd z powłoki i wydrukować. – GL2014

+0

Widzę, co masz na myśli teraz, po prostu próbowałem echo/root/* i nie zwraca błąd w powłoce. Dziękuję Ci. – GL2014

Odpowiedz

5

Funkcja glob nie ma wiele kontroli błędów, z wyjątkiem tego $! jest ustawiony jeśli ostatni glob zawiedzie:

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

Jeśli glob uda się znaleźć coś później, $! nie zostanie ustawiony, chociaż. Na przykład glob "*/*" nie zgłosiłby błędu, nawet gdyby nie mógł wyświetlić zawartości katalogu.

Funkcja bsd_glob ze standardowego modułu File::Glob umożliwia ustawienie flagi, aby umożliwić rzetelne raportowanie błędów:

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

Wykorzystanie pliku :: znalezienia, który jest moduł podstawowy i jest w stanie kontrolować wszystko w pliku.

#!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; 
Powiązane problemy