Filehandles, αρχεία, κατάλογοι
lstat#
Επιστρέφει τη λίστα κατάστασης 13 στοιχείων για μια διαδρομή χωρίς να ακολουθήσει συμβολικό σύνδεσμο.
Η lstat κάνει ακριβώς ό,τι η stat - ίδιο αποτέλεσμα 13 στοιχείων, ίδια ειδική προσωρινή μνήμη filehandle _, ίδια σημασιολογία αποτυχίας - με μία διαφορά: αν το όρισμα κατονομάζει συμβολικό σύνδεσμο, η lstat επιστρέφει πληροφορίες για τον ίδιο τον σύνδεσμο (το δικό του mode, ιδιοκτήτη, μέγεθος, mtime), όχι για τον στόχο στον οποίο δείχνει ο σύνδεσμος. Για οτιδήποτε δεν είναι συμβολικός σύνδεσμος, η lstat και η stat είναι αδιάκριτες. Σε συστήματα χωρίς συμβολικούς συνδέσμους η lstat υποβαθμίζεται σιωπηρά στη stat.
Σύνοψη#
lstat FILEHANDLE
lstat EXPR
lstat DIRHANDLE
lstat
Τι επιστρέφεται#
Σε περιβάλλον λίστας, η ίδια λίστα 13 στοιχείων με τη stat:
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks)
= lstat($path);
Οι σημασίες των πεδίων είναι ίδιες με αυτές της stat - συσκευή, inode, mode (τύπος + δικαιώματα), αριθμός συνδέσμων, uid/gid ιδιοκτήτη, rdev, μέγεθος, atime, mtime, ctime, προτιμώμενο μέγεθος μπλοκ I/O και κατανεμημένα μπλοκ. Τα bits τύπου στο $mode είναι αυτά που ξεχωρίζουν έναν συμβολικό σύνδεσμο: στον ίδιο τον σύνδεσμο αναφέρουν S_IFLNK, ενώ η stat στο ίδιο όνομα θα ανέφερε τον τύπο του στόχου.
Σε βαθμωτό περιβάλλον η lstat επιστρέφει αληθή τιμή σε επιτυχία και κενή συμβολοσειρά σε αποτυχία. Σε αποτυχία η μορφή λίστας επιστρέφει την κενή λίστα και η $! τίθεται στον λόγο (ENOENT, EACCES, κ.λπ.).
Αν η EXPR παραλείπεται, η lstat λειτουργεί επί της $_.
Το filehandle _#
Κάθε επιτυχημένη lstat (και κάθε επιτυχημένη stat ή filetest) γεμίζει τον εσωτερικό «ενταμιευτή τελευταίας stat» του διερμηνέα. Το πέρασμα του bareword _ ως όρισμα επαναχρησιμοποιεί αυτόν τον ενταμιευτή αντί να γίνει άλλη κλήση συστήματος:
if (-l $path && (my @s = lstat(_))) {
# $path was a symlink; @s describes the link, not the target
}
Επειδή το ίδιο το -l εκτελεί lstat εσωτερικά, το παραπάνω lstat(_) δεν κοστίζει τίποτα επιπλέον. Αυτός είναι ο κανονικός τρόπος να «κάνετε αρκετές ερωτήσεις για ένα αρχείο χωρίς να ξανακάνετε stat». Σημειώστε ότι ένα filetest σε όνομα αρχείου bareword (-l $path) αφήνει τον ενταμιευτή να περιγράφει τον σύνδεσμο· ένα filetest σε filehandle ακολουθεί τον ανοιχτό περιγραφέα και έτσι αφήνει ενταμιευτή σχήματος stat. Όταν θέλετε δεδομένα symlink, καταφύγετε ρητά στην lstat.
Καθολική κατάσταση που επηρεάζει#
Παραδείγματα#
Ξεχωρίστε ένα symlink από τον στόχο του. Η stat σε symlink το ακολουθεί σιωπηρά· η lstat όχι:
symlink "/etc/passwd", "link.tmp";
my $via_stat = (stat "link.tmp")[7]; # size of /etc/passwd
my $via_lstat = (lstat "link.tmp")[7]; # size of the link inode
# (length of "/etc/passwd")
Διασχίστε έναν κατάλογο και διαχωρίστε συνδέσμους από κανονικά αρχεία χωρίς δεύτερη κλήση συστήματος ανά εγγραφή, χρησιμοποιώντας τον ενταμιευτή _:
use Fcntl ':mode';
for my $name (readdir $dh) {
next if $name eq '.' || $name eq '..';
lstat "$dir/$name" or next;
if (S_ISLNK((lstat(_))[2])) {
print "link: $name\n";
} elsif (-f _) {
print "file: $name\n";
} elsif (-d _) {
print "dir: $name\n";
}
}
Εντοπίστε αιωρούμενο symlink - η lstat πετυχαίνει στον σύνδεσμο, η stat αποτυγχάνει επειδή ο στόχος δεν υπάρχει:
if (lstat $path and not stat $path) {
warn "$path is a dangling symlink: $!\n";
}
Ακολουθήστε χειροκίνητα τον σύνδεσμο όταν θέλετε και τα δύο κομμάτια πληροφορίας:
my @link = lstat $path or die "lstat $path: $!";
my $target = readlink $path // die "readlink $path: $!";
my @target = stat $path or die "stat $path: $!";
Μορφή χωρίς όρισμα που λειτουργεί επί της $_, ιδιωματική σε μπλοκ preprocess της File::Find και σε φίλτρα grep:
my @symlinks = grep { lstat; -l _ } @paths;
Οριακές περιπτώσεις#
Δεν είναι symlink: η
lstatσυμπεριφέρεται ακριβώς όπως ηstat- δεν υπάρχει ποινή στο να προτιμάτε τηνlstatόταν πρόκειται να διακλαδωθείτε με-l.Συστήματα χωρίς symlinks: η
lstatκαταφεύγει σιωπηρά στηstat. Κώδικας γραμμένος έναντι τηςlstatπαραμένει φορητός· απλώς χάνει τη διακριτική συμπεριφορά.Όρισμα filehandle / dirhandle: ένα FILEHANDLE ή DIRHANDLE που περνιέται αναφέρεται σε ήδη ανοιγμένο περιγραφέα, που δεν μπορεί ο ίδιος να είναι symlink (ο πυρήνας επίλυσε τον σύνδεσμο τη στιγμή της
open). Ηlstat FILEHANDLEσυνεπώς επιστρέφει το ίδιο αποτέλεσμα με τηstatσε αυτό το handle. Χρησιμοποιήστε τη μορφή EXPR στη διαδρομή όταν χρειάζεστε τα μεταδεδομένα του συνδέσμου.Η
lstat(_)μετά από αποτυχημένηlstat: ο ενταμιευτής_αφήνεται σε όποια κατάσταση τον άφησε η τελευταία επιτυχημένη stat. Μια αποτυχημένηlstatδεν τον εκκαθαρίζει. Πάντα ελέγχετε την τιμή επιστροφής πριν διαβάσετε το_.Σχετικές διαδρομές: επιλύονται ως προς τον τρέχοντα κατάλογο εργασίας της διεργασίας, όπως και στη
stat.Δικαίωμα για
lstat: απαιτεί δικαίωμα αναζήτησης (x) σε κάθε συστατικό καταλόγου της διαδρομής, αλλά - σε αντίθεση με τηstat- δεν απαιτεί κανένα δικαίωμα στον στόχο του συνδέσμου. Ηlstatσυνεπώς πετυχαίνει σε συνδέσμους προς καταλόγους που δεν μπορείτε να διαβάσετε.Bareword έναντι έκφρασης: η
lstat $fhόπου το$fhκρατάει filehandle κάνει stat στο handle· ηlstat "$fh"μετατρέπει σε συμβολοσειρά το$fhκαι κάνει stat στην προκύπτουσα (συνήθως άνευ νοήματος) διαδρομή. Βάλτε εισαγωγικά σκόπιμα.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
stat- ο αντίστοιχος που ακολουθεί τους συνδέσμους· ίδιο σχήμα επιστροφής και σημασιολογία_readlink- διαβάστε τη συμβολοσειρά στόχου ενός συμβολικού συνδέσμου χωρίς να του κάνετε statsymlink- δημιουργία συμβολικού συνδέσμου-l- τελεστής filetest για το «είναι συμβολικός σύνδεσμος»· εσωτερικά εκτελείlstatκαι αφήνει το αποτέλεσμα στο_$_- προεπιλεγμένο όρισμα όταν ηEXPRπαραλείπεται$!- λόγος αποτυχίας όταν ηlstatεπιστρέφει την κενή λίστα