2013-06-20 7 views
5

Das folgende einfache Perl-Skript listet den Inhalt eines Verzeichnisses auf, wobei das Verzeichnis als Argument für das Skript aufgeführt wird. Wie kann ich auf einem Linux-System Fehler mit Zugriffsverweigerung erfassen? Wenn dieses Skript derzeit in einem Verzeichnis ausgeführt wird, für das der Benutzer keine Leseberechtigung hat, passiert nichts im Terminal.Wie erhalte ich Fehler bei der Berechtigung verweigert vom Glob-Operator?

#!/bin/env perl 

use strict; 
use warnings; 

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

print_dir @ARGV 
+0

Was Sie fragen, wäre atypisches Verhalten von einem 'glob'. 'stat' kann Ihnen sagen, ob Sie Zugriff auf das Verzeichnis haben. –

+0

Ich verstehe, dass Glob keine Kenntnis von den Berechtigungen des Benutzers hat, aber ich nehme an, dass die Shell einen Fehler an das Skript zurückgibt, aber es wird nicht gedruckt, ist das nicht korrekt? Mich interessiert, wie ich den Fehler von der Shell abfangen und ausdrucken kann. – GL2014

+0

Ich sehe, was Sie jetzt meinen, ich habe gerade versucht, echo/root/* und es gibt keinen Fehler in der Shell. Vielen Dank. – GL2014

Antwort

5

Die glob Funktion, außer die Kontrolle viel Fehler nicht, dass $! gesetzt, wenn der letzte glob fehlschlägt:

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

Wenn die glob später etwas zu finden, gelingt es, $! wird nicht gesetzt, obwohl. Zum Beispiel würde glob "*/*" keinen Fehler melden, selbst wenn er den Inhalt eines Verzeichnisses nicht auflisten könnte.

Die bsd_glob Funktion aus dem Standard-File::Glob Modul ermöglicht das Setzen eines Flags zuverlässige Fehlerberichterstattung zu aktivieren:

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

Use File :: Find, das ein Kernmodul ist und in der Lage, auf eine Datei, alles zu kontrollieren.

#!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; 
Verwandte Themen