Σύνδεσμοι μαλακοί και σκληροί

...ασύγχρονα μαθήματα Τερματικού

Σύνδεσμοι μαλακοί και σκληροί

Δημοσίευσηαπό lucinos » 24 Ιαν 2012, 02:43

Ένα θέμα το οποίο απλώς αναφέρθηκε αστραπιαία είναι οι σύνδεσμοι. Είναι εκείνα τα αρχεία με το χαρακτηριστικό "l". Οι σύνδεσμοι μοιάζουν με τις γνωστές «συντομεύσεις» (shortcuts). Ας δούμε πρώτα τι είναι οι συντομεύσεις.

Οι συντομεύσεις μπορούν γενικά να θεωρηθούν απλά εκτελέσιμα που τρέχουν/ανοίγουν το αρχείο/φάκελο που θες από μια τοποθεσία που βρίσκεις βολικότερη.
Γεια παράδειγμα (υποθέτω ότι υπάρχουν οι φάκελοι ~/playground ~/playground/play ~/playground/ground )
μπορούμε να δημιουργήσουμε ένα σενάριο play στον φάκελο ground. Φτιάξτε ένα σενάριο (σκριπτάκι) με κώδικα:
Κώδικας: Επιλογή όλων
#!/bin/bash
nautilus ~/playground/play


Όταν το τρέχετε ανοίγει ο ναυτίλος τον φάκελο ~/playground/play.
Μπορείτε να το τρέξετε και από το γραφικό περιβάλλον με το ίδιο αποτέλεσμα.
Θα τσινίσει ρωτώντας αν θα το εκτελέσετε σαν μέσα από τερματικό, δεν έχει σημασία αν θα επιλέξετε αυτό ή κανονική εκτέλεση, θα τρέξει σωστά. Αυτά τα προβλήματα προφανώς είναι τεχνικές λεπτομέρειες που κάποιος θα μπορούσε εύκολα να λύσει ακόμα και να αυτοματοποιήσει μέσα από το γραφικό περιβάλλον, και η αλήθεια είναι ότι προηγούμενες εκδόσεις τού ubuntu είχαν τούς λεγόμενους εκκινητές. Η νεώτερη (11.10) έχει ξεφορτωθεί αυτό το χαρακτηριστικό (υποθέτω ότι ευθύνεται το gnome3). Οι συντομεύσεις φαίνεται ότι είναι ένα χαρακτηριστικό πολύ κοινό στα windows και το οποίο ποτέ δεν έτυχε αποδοχής στο λίνουξ. Μάλλον μπορεί να θεωρηθεί και κάπως αντι-unix μέθοδος. Επίσης τα γραφικά κελύφη αναπτύσουν διαφορετικούς τρόπους για την προσπέλαση τών αρχείων και τών εφαρμογών (όπως η γνωστή μπάρα με τούς εκκινητές στο unity)

Αντί για τις συντομεύσεις στο λίνουξ είναι κάπως περισσότερο κοινή η χρήση συνδέσμων. Οι σύνδεσμοι είναι πολύ πιο βασική έννοια. Στον φάκελο ~/playground/play τρέχτε:
Κώδικας: Επιλογή όλων
ln -s ~/playground/ground/ ground


Τρέχτε τώρα για να δείτε τι κάνατε:
Κώδικας: Επιλογή όλων
ls -l


Έχετε μόλις δημιουργήσει έναν σύνδεσμο! Αυτό το αρχείο λειτουργεί σαν να ήταν ο ίδιος ο φάκελος ~/playground/ground/.
Αυτός λειτουργεί τόσο από την γραμμή εντολών, όσο και από το γραφικό περιβάλλον. Στην πραγματικότητα οποιοδήποτε πρόγραμμα πέσει πάνω του θα τον αντιμετωπίσει σαν κανονικό φάκελο (ή αν κάναμε τον σύνδεσμο σε ένα αρχείο ως κανονικό αρχείο το ίδιο). Έτσι οι σύνδεσμοι διαφέρουν από τις συντομεύσεις και η λειτουργικότητά τους είναι πολύ μεγαλύτερη. Γεια παράδειγμα αν έχουμε ένα αρχείο σε ένα μέρος και κάποιο πρόγραμμα το γυρεύει σε ένα άλλο μέρος αντί να το μεταφέρουμε εκεί (με πιθανότητα η μεταφορά αυτή να δημιουργήσει άλλα προβλήματα) ή να δημιουργήσουμε ένα αντίγραφο μπορούμε απλά να δημιουργήσουμε έναν σύνδεσμο. Ή άλλο παράδειγμα αν εγκαταστήσουμε μια νέα έκδοση μιας εφαρμογής, δεν απαιτείται να σβήσουμε την παλιά, μπορούμε απλά να έχουμε έναν σύνδεσμο και να τού αλλάζουμε το αρχείο που δείχνει. Για παράδειγμα σε μένα αν τρέξω:
Κώδικας: Επιλογή όλων
ls -l $(which python)

μού δίνει:
Κώδικας: Επιλογή όλων
lrwxrwxrwx 1 root root 9 2011-10-22 20:05 /usr/bin/python -> python2.7

ταυτοχρόνως υπάρχει και η python2.6 εγκατεστημένη, και αν αργότερα εγκαταστήσω την python2.8 θα αρκεί η αλλαγή τού συνδέσμου python και μόνον.

Τούς συνδέσμους μπορείτε να τούς δημιουργήσετε και από το γραφικό περιβάλλον. Διαλέγετε ένα αρχείο ή φάκελο με δεξί κλικ και επιλέγετε Δημιουργία συνδέσμου.

Οι σύνδεσμοι προσφέρουν έτσι πολύ μεγαλύτερη λειτουργικότητα από τις συντομεύσεις ακολουθώντας την πάγια λογική τού unix να κάνουν ένα πράγμα καλά. Από την άλλη ένας κοινός χρήστης μπορεί να επιθυμεί κάτι πιο σύνθετο που μπορεί να το προσφέρει ενδεχομένως μια συντόμευση αλλά την τελευταία δεν θα την αναγνωρίζει σωστά οποιαδήποτε εφαρμογή.

Επίσης αν για παράδειγμα αν μπείτε σε έναν σύνδεσμο φακέλου τότε η διαδρομή δεν θα είναι αυτή τού κανονικού φακέλου. Αυτό το λογικό και χρήσιμο χαρακτηριστικό σε κάποιον κοινό χρήστη μπορεί να μην αρέσει. Γενικά από την σκοπιά ενός διαχειριστή συστήματος οι σύνδεσμοι είναι απαραίτητο χαρακτηριστικό, ενώ από την σκοπιά ενός κοινού χρήστη οι συντομεύσεις είναι πρακτικότερες, αλλά στην πράξη ένα γραφικό περιβάλλον μπορεί να προσφέρει ακόμα καλύτερες εναλλακτικές ενώ οι σύνδεσμοι είναι αναντικατάστατοι.

Η επιλογή -s είναι πολύ σημαντική. Αυτή καθορίζει ότι πρόκειται για συμβολικό σύνδεσμο (symbolic link, εγώ τούς είχα ακούσει και σαν μαλακούς συνδέσμους). Οι συμβολικοί σύνδεσμοι διατηρούν κάποια αυτονομία σε σχέση με το αρχικό αρχείο. Έτσι αν σβήσετε τον συμβολικό σύνδεσμο, το αρχικό αρχείο θα συνεχίσει να υπάρχει κανονικά, ενώ αν σβήσετε το αρχικό αρχείο ο συμβολικός σύνδεσμος χάνει το αντικείμενό του. Συμπεριφέρεται δηλαδή ως ξεχωριστό αρχείο.

Ακόμα πιο βασικό (και φαίνεται πιο παράξενο) είδος συνδέσμου είναι ο λεγόμενος σκληρός σύνδεσμος (hard link). Στην πραγματικότητα τούς σκληρούς συνδέσμους τούς έχετε ήδη συναντήσει άπειρες φορές. Κάθε αρχείο που βλέπετε είναι στην πραγματικότητα σκληρός σύνδεσμος. Κατά βάθος αυτό το ξέρατε ήδη. Όταν για παράδειγμα μετακινείτε ένα αρχείο μέσα στην ίδια κατάτμηση αυτό συμβαίνει ακαριαία ανεξάρτητα από το μέγεθος τού αρχείου. Αυτό συμβαίνει γιατί το μηχάνημα δεν μετακινεί όλο το αντικείμενο αλλά η μετακίνηση γίνεται μονάχα στο όνομα. Αυτό που ίσως δεν ξέρατε είναι ότι μπορείτε να δημιουργήσετε περισσότερους τέτοιους συνδέσμους στο ίδιο αρχείο. Ας δημιουργήσουμε για παράδειγμα ένα αρχείο (έστω μέσα στον φάκελο ~/playground/ground
Κώδικας: Επιλογή όλων
echo 'hello nurse!' > hello_nurse

ας δημιουργήσουμε τώρα έναν σκληρό σύνδεσμο
Κώδικας: Επιλογή όλων
ln hello_nurse nurse
.
έχουμε ένα ολόϊδιο αρχείο nurse με τις ίδιες άδειες, το ίδιο μέγεθος, το ίδιο περιεχόμενο με το hello_nurse. Δεν είναι όμως στην πραγματικότητα ολόϊιδιο αλλά είναι το ίδιο. Δεν είναι αντίγραφο και ο χώρος που πιάνει δεν είναι ίσος, είναι ο ίδιος χώρος. Ένα αρχείο ουσιαστικά αποτελείτε από δύο μέρη. Το ίδιο το αντικείμενο, στο οποίο βρίσκουμε το περιεχόμενο του αρχείου και τον σκληρό σύνδεσμο σε αυτό. Μπορούμε να δούμε ότι πρόκειται για το ίδιο αντικείμενο τρέχοντας:
Κώδικας: Επιλογή όλων
ls -li

Εδώ φαίνεται ότι έχουν τον ίδιο δείκτη. Αυτό συμβαίνει γιατί είναι το ίδιο αντικείμενο.
Μπορούμε μάλιστα να διαγράψουμε το αρχικό. Αυτό δεν θα ενοχλήσει καθόλου τον άλλο σκληρό σύνδεσμο:
Κώδικας: Επιλογή όλων
rm hello_nurse

τώρα για παράδειγμα με:
Κώδικας: Επιλογή όλων
cat nurse

βλέπουμε ότι ο δεύτερος σκληρός σύνδεσμος καθόλου δεν ενοχλήθηκε. Ο λόγος είναι ότι κάθε αντικείμενο μπορεί να έχει έναν ή περισσότερους σκληρούς συνδέσμους. Διαγράφεται όταν δεν έχει πλέον κανέναν σύνδεσμο. Είναι η ίδια λογική με τις μεταβλητές τής python.

Μια ακόμα σημαντική διαφορά τών σκληρών συνδέσμων είναι ότι το Linux δεν επιτρέπει να δημιουργήσουμε σκληρό σύνδεσμο σε φάκελο. Αυτό το κάνει γιατί να αποτραπεί το ενδεχόμενο μιας άπειρης αυτοαναφοράς.
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση

Επιστροφή στο Μαθήματα Τερματικού