Filehandles, αρχεία, κατάλογοι
readlink#
Επιστρέφει τη διαδρομή στόχου στην οποία δείχνει ένας συμβολικός σύνδεσμος.
Η readlink ρωτά τον πυρήνα ποια συμβολοσειρά είναι αποθηκευμένη μέσα σε έναν συμβολικό σύνδεσμο, χωρίς να τον ακολουθεί και χωρίς να αγγίζει το αρχείο στο οποίο τελικά αναλύεται ο σύνδεσμος. Το όρισμα είναι η διαδρομή του ίδιου του συνδέσμου· η τιμή επιστροφής είναι η ακατέργαστη συμβολοσειρά στόχου όπως καταγράφηκε όταν δημιουργήθηκε ο σύνδεσμος. Αν παραλειφθεί το EXPR, χρησιμοποιείται το $_.
Σύνοψη#
readlink EXPR
readlink
Τι επιστρέφεται#
Σε επιτυχία, ο στόχος του συνδέσμου ως συμβολοσειρά - ακριβώς τα bytes που είναι αποθηκευμένα στο symlink, χωρίς καμία ερμηνεία. Σε αποτυχία, undef, με το $! να τίθεται στο σφάλμα του συστήματος. Τυπικοί κωδικοί σφάλματος:
EINVAL- η διαδρομή υπάρχει αλλά δεν είναι συμβολικός σύνδεσμοςENOENT- η διαδρομή δεν υπάρχειEACCES- ένα στοιχείο καταλόγου δεν είναι αναζητήσιμοELOOP,ENAMETOOLONG,ENOTDIR- οι συνηθισμένες αποτυχίες ανάλυσης διαδρομής σε στοιχεία που οδηγούν στον σύνδεσμο
Η επιστρεφόμενη συμβολοσειρά δεν κανονικοποιείται και δεν μετατρέπεται σε απόλυτη. Ένας σύνδεσμος που δημιουργήθηκε με ln -s ../lib/libfoo.so libfoo.so επιστρέφει το κυριολεκτικό "../lib/libfoo.so", σχετικά ως προς τον κατάλογο που περιέχει τον ίδιο τον σύνδεσμο - όχι ως προς τον τρέχοντα κατάλογο εργασίας. Η ανάλυση του στόχου σε απόλυτη, πραγματική διαδρομή είναι ευθύνη του καλούντος· δείτε Cwd::abs_path.
Καθολική κατάσταση που επηρεάζει#
Παραδείγματα#
Ανάγνωση του στόχου ενός συνδέσμου απευθείας:
my $target = readlink "/usr/bin/vi";
print defined $target ? "points to $target\n" : "not a symlink: $!\n";
Μορφή με προεπιλεγμένο όρισμα μέσα σε βρόχο επί ονομάτων αρχείων:
for (@paths) {
next unless -l; # skip anything that isn't a symlink
my $t = readlink; # reads $_
print "$_ -> $t\n" if defined $t;
}
Προστατευτείτε ρητά έναντι μη-symlinks. Η readlink σε κανονικό αρχείο επιστρέφει undef και θέτει το $! σε EINVAL:
my $t = readlink $path;
if (!defined $t) {
die "readlink $path: $!" unless $!{EINVAL};
# not a symlink - handle as a plain file
}
Αναλύστε έναν σχετικό στόχο συνδέσμου ως προς τον δικό του κατάλογο, που είναι η σωστή βάση - όχι ο τρέχων κατάλογος εργασίας:
use File::Basename qw(dirname);
use File::Spec;
my $target = readlink $link // die "readlink $link: $!";
my $resolved = File::Spec->rel2abs($target, dirname($link));
Κανονικοποιήστε πλήρως (ακολουθώντας κάθε σύνδεσμο στην αλυσίδα, καταργώντας τα . και .., παράγοντας απόλυτη διαδρομή) με Cwd::abs_path:
use Cwd qw(abs_path);
my $real = abs_path($link); # undef if any component is missing
Οριακές περιπτώσεις#
Δεν είναι symlink: η
readlinkσε κανονικό αρχείο, κατάλογο, ή οτιδήποτε άλλο που δεν είναι συμβολικός σύνδεσμος επιστρέφειundefκαι θέτει το$!σεEINVAL. Ελέγξτε πρώτα με-lαν θέλετε να διακρίνετε το «δεν είναι σύνδεσμος» από άλλα σφάλματα.Ελλείπουσα διαδρομή: ένα στοιχείο του
EXPRπου δεν υπάρχει δίνειENOENT, όπως κάθε άλλη αποτυχία αναζήτησης διαδρομής.Προεπιλεγμένο όρισμα: η σκέτη
readlinkχρησιμοποιεί το$_. Δεν εκπέμπεται προειδοποίηση όταν το$_είναιundef· η κλήση απλώς αποτυγχάνει με σφάλμα αναζήτησης διαδρομής.Τελικά στοιχεία: η
readlinkλειτουργεί μόνο επί του τελικού στοιχείου - ενδιάμεσα symlinks στη διαδρομή ακολουθούνται κανονικά. Ηreadlink "/a/b/c"όπου το/aείναι το ίδιο symlink διαβάζει τον σύνδεσμο στοc, όχι στοa.Σχετικός στόχος, αμετάβλητος: η επιστρεφόμενη συμβολοσειρά αποθηκεύεται αυτολεξεί. Μην υποθέτετε ποτέ ότι η συμβολοσειρά είναι απόλυτη, και ποτέ μην την ενώσετε με τον τρέχοντα κατάλογο εργασίας - ενώστε την με τον κατάλογο που περιέχει τον σύνδεσμο, ή τροφοδοτήστε τη διαδρομή του συνδέσμου (όχι τον στόχο) στην
Cwd::abs_path.Κρεμασμένοι σύνδεσμοι: ένας σύνδεσμος του οποίου ο στόχος δεν υπάρχει εξακολουθεί να διαβάζεται κανονικά. Η
readlinkδεν κάνει stat στον στόχο. Χρησιμοποιήστεlstatγια να επιθεωρήσετε τον ίδιο τον σύνδεσμο,statγια να επιθεωρήσετε σε ό,τι δείχνει (και να αποτύχετε αν ο στόχος λείπει).Πλατφόρμες χωρίς symlinks: σε συστήματα που δεν υλοποιούν συμβολικούς συνδέσμους, η
readlinkεγείρει εξαίρεση αντί να επιστρέψειundef. Το Linux (ο μοναδικός υποστηριζόμενος στόχος του pperl) τα έχει πάντοτε, οπότε αυτό είναι σχετικό μόνο για φορητό κώδικα που μοιράζεται με άλλους στόχους.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
symlink- δημιουργία συμβολικού συνδέσμου· η αντίστροφη πράξηlink- δημιουργία σκληρού συνδέσμου (δεν διαβάζεται μεreadlink· οι σκληροί σύνδεσμοι είναι μη-διακριτοί από το αρχικό όνομα)lstat-statστον ίδιο τον συμβολικό σύνδεσμο αντί στον στόχο του· χρησιμοποιήστε μαζί με τηνreadlinkγια πλήρη επιθεώρηση συνδέσμου-l- file test για «είναι συμβολικός σύνδεσμος»· ελέγξτε πριν την κλήση τηςreadlinkγια να αποσαφηνίσετε τοEINVALαπό άλλα σφάλματα$!-errnoπου τίθεται σε αποτυχία· το$!{EINVAL}διακρίνει το «δεν είναι symlink» από άλλα σφάλματα