Filehandles, αρχεία, κατάλογοι
symlink#
Δημιουργεί ένα symbolic link στο NEWFILE που δείχνει στη συμβολοσειρά OLDFILE.
Η symlink είναι το λεπτό περιτύλιγμα γύρω από την κλήση συστήματος POSIX symlink(2). Δεν αντιγράφει τίποτα, δεν διαβάζει το OLDFILE και δεν απαιτεί το OLDFILE να υπάρχει. Γράφει μια νέα εγγραφή καταλόγου στο NEWFILE της οποίας το payload είναι τα κυριολεκτικά bytes του OLDFILE, και ο πυρήνας αργότερα επιλύει αυτό το payload κάθε φορά που κάτι ανοίγει, στατιστικοποιεί ή διασχίζει το link.
Σύνοψη#
symlink OLDFILE, NEWFILE
Τι επιστρέφεται#
1 σε επιτυχία, 0 σε αποτυχία (με την $! ορισμένη). Σε συστήματα που δεν υποστηρίζουν καθόλου symbolic links, η symlink εγείρει εξαίρεση αντί να επιστρέψει 0. Για να διερευνήσετε την υποστήριξη κατά τον χρόνο εκτέλεσης χωρίς να τερματίσετε, τυλίξτε μια αβλαβή κλήση σε eval:
my $symlink_exists = eval { symlink("", ""); 1 };
Το μοτίβο eval είναι ο ιδιωματικός έλεγχος δυνατότητας - εκτελεί μια no-op symlink της οποίας η μόνη δουλειά είναι να αποτυγχάνει με χαμηλό κόστος σε πλατφόρμες όπου η κλήση υπάρχει, και να εκτοξεύει σε πλατφόρμες όπου δεν υπάρχει.
Πώς διαφέρουν τα symlinks από τους σκληρούς συνδέσμους#
Ένα symlink και ένας σκληρός σύνδεσμος (link) μοιάζουν παρόμοιοι από το κέλυφος αλλά συμπεριφέρονται πολύ διαφορετικά:
Η
linkδημιουργεί μια δεύτερη εγγραφή καταλόγου που δείχνει στο ίδιο inode. Και τα δύο ονόματα είναι ισότιμα· η διαγραφή του ενός αφήνει το αρχείο ζωντανό κάτω από το άλλο.Η
symlinkδημιουργεί ένα μικροσκοπικό αρχείο τύπουlnkτου οποίου το περιεχόμενο είναι ένα όνομα διαδρομής. Ο στόχος επιλύεται κατ” όνομα σε κάθε αναζήτηση. Τα δύο ονόματα δεν είναι ισότιμα - το symlink έχει το δικό του inode, τα δικά του bits δικαιωμάτων (που ως επί το πλείστον αγνοούνται) και τις δικές του χρονικές σφραγίδες.
Πρακτικές συνέπειες:
Το
OLDFILEαποθηκεύεται αυτούσιο. Δεν κανονικοποιείται, δεν επιλύεται έναντι του τρέχοντος καταλόγου εργασίας και δεν ελέγχεται για ύπαρξη. Ένα symlink μπορεί να δημιουργηθεί δείχνοντας σε διαδρομή που δεν υπάρχει ακόμη (ένα κρεμασμένο symlink) και θα αρχίσει να λειτουργεί τη στιγμή που εμφανιστεί ο στόχος.Επειδή το
OLDFILEείναι απλώς συμβολοσειρά, μπορεί να είναι σχετική διαδρομή. Οι σχετικοί στόχοι symlink επιλύονται κατά τον χρόνο αναζήτησης σχετικά με τον κατάλογο που περιέχει τοNEWFILE, όχι τον τρέχοντα κατάλογο εργασίας της διεργασίας. Αυτή είναι η μεγαλύτερη μεμονωμένη πηγή εκπλήξεων.Τα symlinks μπορούν να διασχίζουν όρια συστημάτων αρχείων. Οι σκληροί σύνδεσμοι όχι.
Τα symlinks μπορούν να δείχνουν σε καταλόγους. Οι σκληροί σύνδεσμοι προς καταλόγους απαγορεύονται σε κάθε mainstream Unix.
Η
unlinkσε symlink αφαιρεί το link, όχι τον στόχο. Για να αφαιρέσετε τον στόχο, εκτελέστε unlink απευθείας στη διαδρομή του στόχου.
Παραδείγματα#
Δημιουργία symlink προς υπάρχον αρχείο:
symlink "/etc/hostname", "hostname.lnk"
or die "symlink failed: $!";
Κρεμασμένο symlink - ο στόχος δεν υπάρχει ακόμη, και αυτό είναι εντάξει:
symlink "/will/appear/later", "pending.lnk"
or die "symlink failed: $!";
# opening pending.lnk now fails with ENOENT;
# it will start working once /will/appear/later exists.
Σχετικός στόχος που επιλύεται έναντι του καταλόγου του link, όχι του cwd:
chdir "/var/log" or die $!;
symlink "syslog", "/tmp/current.lnk"
or die "symlink failed: $!";
# readlink("/tmp/current.lnk") eq "syslog"
# opening /tmp/current.lnk resolves syslog in /tmp, not /var/log.
Symlink προς κατάλογο - αυτό λειτουργεί, σε αντίθεση με την link:
symlink "/var/log", "logs"
or die "symlink failed: $!";
opendir my $dh, "logs" or die $!; # traverses the symlink
Επιθεώρηση και αφαίρεση symlink χωρίς να αγγίξετε τον στόχο του:
my $target = readlink "hostname.lnk"; # the stored OLDFILE string
unlink "hostname.lnk" or die $!; # removes the link only
# /etc/hostname is untouched.
Μοτίβο ατομικής αντικατάστασης - αντικατάσταση symlink που δείχνει στον κατάλογο της «τρέχουσας» έκδοσης γράφοντας ένα νέο symlink και κάνοντας rename πάνω από αυτό:
symlink "release-2", "current.new" or die $!;
rename "current.new", "current" or die $!;
# rename over an existing symlink is atomic on POSIX filesystems.
Οριακές περιπτώσεις#
OLDFILEis stored verbatim. No normalisation, no resolution, no existence check.symlink "", "foo"succeeds on most systems and creates an empty-target symlink that every lookup rejects withENOENT. This is why the capability-probe idiom uses("", "")a cheap call that always fails on supporting platforms.
Το σχετικό
OLDFILEεπιλύεται σχετικά με τον κατάλογο τουNEWFILE, όχι τον τρέχοντα κατάλογο εργασίας. Αν χτίζετε τοNEWFILEαπό σχετική διαδρομή, σκεφτείτε προσεκτικά σε ποιον κατάλογο θα το δει ο πυρήνας.Το
NEWFILEυπάρχει ήδη → αποτυχία με την$!ορισμένη σεEEXIST. Δεν υπάρχει σημαία «αντικατάστασης»· για να αντικαταστήσετε, γράψτε σε νέο όνομα καιrenameπάνω από το παλιό (ατομικά).Τα δικαιώματα στο ίδιο το symlink σχεδόν πάντα αγνοούνται. Ο πυρήνας επιβάλλει τα δικαιώματα του στόχου. Στα περισσότερα συστήματα αρχείων το symlink αναφέρεται ως
lrwxrwxrwxανεξάρτητα από το τι καλείται ηchmodσε αυτό.Η
statακολουθεί τα symlinks, ηlstatόχι. Για να εξετάσετε το ίδιο το link - τον τύπο του, το link count του, το μήκος της συμβολοσειράς στόχου του - χρησιμοποιήστεlstat. Για να εξετάσετε σε τι δείχνει το link, χρησιμοποιήστεstat.Η
unlinkαφαιρεί το link, όχι τον στόχο. Δεν υπάρχει τρόπος να διαγραφεί ο στόχος μέσω του symlink εκτός από το να τον επιλύσετε πρώτα.Πλατφόρμες χωρίς υποστήριξη symlink εγείρουν εξαίρεση σε οποιαδήποτε κλήση, ακόμα και σε μία που διαφορετικά θα αποτύγχανε. Χρησιμοποιήστε τον έλεγχο
evalπου δείχθηκε παραπάνω αντί να υποθέτετε μια τιμή επιστροφής.Συστήματα αρχείων χωρίς υποστήριξη symlink (ορισμένες παραλλαγές FAT, ορισμένες προσαρτήσεις δικτύου) αποτυγχάνουν με
EPERMήEOPNOTSUPPακόμη και σε πυρήνα που υλοποιεί τηνsymlink(2). Ελέγξτε την$!σε αποτυχία αντί να υποθέτετε ότι η κλήση απορρίφθηκε για τον προφανή λόγο.Οι κύκλοι symlink δεν ανιχνεύονται κατά τη δημιουργία. Η
symlink "a", "b"ακολουθούμενη απόsymlink "b", "a"πετυχαίνει· ο κύκλος εμφανίζεται μόνο όταν κάτι προσπαθήσει να επιλύσει κάποιο από τα δύο ονόματα, που αποτυγχάνει μεELOOPαφού ο πυρήνας φτάσει στο όριο καταδίωξής του (τυπικά 40).
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
link- δημιουργεί σκληρό σύνδεσμο (ίδιο inode, ίδιο σύστημα αρχείων, μόνο αρχείο)· το αυστηρό αντίστοιχο τηςsymlinkreadlink- διαβάζει τη συμβολοσειράOLDFILEπου είναι αποθηκευμένη σε symlink χωρίς να την επιλύσειlstat- κάνει stat στο ίδιο το symlink αντί στον στόχο του· ο μόνος τρόπος να δείτε από Perl ότι μια διαδρομή είναι symlinkstat- κάνει stat σε αυτό στο οποίο δείχνει το symlink, ακολουθώντας την αλυσίδα συνδέσμωνunlink- αφαιρεί ένα symlink (το link, όχι τον στόχο)· επίσης ο τρόπος αφαίρεσης κρεμασμένου symlink$!- ηerrnoπου τίθεται σε αποτυχία· επιθεωρήστε την για να διακρίνετεEEXIST,EPERM,EOPNOTSUPP,ENOENTστον γονικό κατάλογο