Διαδρομή Linux πώς να καθορίσετε διαδρομές φακέλων. Μεταβλητή περιβάλλοντος PATH. Προσθήκη μεταβλητών περιβάλλοντος χρήστη και συστήματος στο Linux

Όταν εισάγετε την εντολή στο γραμμή εντολών, βασικά λέτε στο κέλυφος να εκτελέσει ένα εκτελέσιμο αρχείο με ένα δεδομένο όνομα. Σε Linux αυτά εκτελέσιμα προγράμματα, όπως τα ls, find, file και άλλα τείνουν να ζουν σε πολλούς διαφορετικούς καταλόγους στο σύστημά σας. Οποιοδήποτε αρχείο με εκτελέσιμα δικαιώματα που είναι αποθηκευμένα σε αυτούς τους καταλόγους μπορεί να εκτελεστεί από οπουδήποτε. Οι πιο συνηθισμένοι κατάλογοι που περιέχουν εκτελέσιμα προγράμματα είναι οι /bin, /sbin, /usr/sbin, /usr/local/bin και /usr/local/sbin.

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

Η απάντηση είναι απλή. Όταν εκδίδετε μια εντολή, το κέλυφος αναζητά όλους τους καταλόγους που καθορίζονται στη μεταβλητή $PATH του χρήστη για ένα εκτελέσιμο αρχείο με αυτό το όνομα.

Αυτό το άρθρο σας δείχνει πώς να προσθέσετε καταλόγους στη μεταβλητή $PATH του συστήματός σας.

Τι είναι το $PATH στο Linux

Η μεταβλητή περιβάλλοντος $PATH είναι μια αποικισμένη λίστα καταλόγων που δηλώνει στο κέλυφος ποιους καταλόγους να αναζητήσει για εκτελέσιμα αρχεία.

Για να ελέγξετε ποιους καταλόγους έχετε στη μεταβλητή $PATH, μπορείτε να χρησιμοποιήσετε την εντολή printenv ή echo:

Echo $PATH

Η έξοδος θα μοιάζει κάπως έτσι:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

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

Προσθήκη καταλόγου στο $PATH

Υπάρχουν περιπτώσεις όπου μπορεί να θέλετε να προσθέσετε άλλους καταλόγους στη μεταβλητή $PATH. Για παράδειγμα, ορισμένα προγράμματα μπορεί να είναι εγκατεστημένα σε διαφορετικές τοποθεσίες ή μπορεί να θέλετε να έχετε έναν αποκλειστικό κατάλογο για τις προσωπικές σας καταχωρήσεις, αλλά να μπορείτε να τα εκτελέσετε χωρίς να καθορίσετε την απόλυτη διαδρομή προς τα εκτελέσιμα. Για να το κάνετε αυτό, χρειάζεται απλώς να προσθέσετε τον κατάλογο στο $PATH.

Ας υποθέσουμε ότι έχετε έναν κατάλογο που ονομάζεται bin και βρίσκεται στον αρχικό σας κατάλογο στον οποίο αποθηκεύετε τα σενάρια του κελύφους σας. Για να προσθέσετε έναν κατάλογο στη μεταβλητή $PATH:

Η εντολή εξαγωγής εξάγει την τροποποιημένη μεταβλητή στα θυγατρικά περιβάλλοντα των διεργασιών φλοιού.

Τώρα μπορείτε να εκτελέσετε τα σενάρια σας πληκτρολογώντας απλώς το όνομα του εκτελέσιμου σεναρίου χωρίς να καθορίσετε την πλήρη διαδρομή προς το εκτελέσιμο αρχείο.

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

Για να κάνετε την αλλαγή μόνιμη, πρέπει να ορίσετε μια μεταβλητή $PATH στα αρχεία διαμόρφωσης του κελύφους σας. Στις περισσότερες διανομές Linux, κατά την έναρξη μιας νέας περιόδου λειτουργίας, οι μεταβλητές περιβάλλοντος διαβάζονται από τα ακόλουθα αρχεία:

  • Καθολικά αρχεία διαμόρφωσης κελύφους όπως /etc/environment και /etc/profile. Χρησιμοποιήστε αυτό το αρχείο εάν θέλετε ο νέος κατάλογος να προστεθεί σε όλους χρήστες του συστήματος$PATH.
  • Αρχεία διαμόρφωσης για μεμονωμένα κελύφη χρηστών. Για παράδειγμα, εάν χρησιμοποιείτε το Bash, μπορείτε να ορίσετε τη μεταβλητή $PATH στο αρχείο ~/.bashrc και εάν χρησιμοποιείτε Zsh, το όνομα του αρχείου είναι ~/.zshrc.

Σε αυτό το παράδειγμα, θα ορίσουμε μια μεταβλητή στο αρχείο ~/.bashrc. Ανοίξτε το αρχείο επεξεργαστής κειμένουκαι προσθέστε την ακόλουθη γραμμή στο τέλος:

Nano ~/.bashrc

Εξαγωγή PATH="$HOME/bin:$PATH"

Αποθηκεύστε το αρχείο και φορτώστε τη νέα τιμή $PATH στην τρέχουσα περίοδο λειτουργίας φλοιού χρησιμοποιώντας:

Πηγή ~/.bashrc

Για να επιβεβαιώσετε ότι ο κατάλογος προστέθηκε με επιτυχία, εκτυπώστε την τιμή $PATH πληκτρολογώντας:

Echo $PATH

συμπέρασμα

Η προσθήκη νέων καταλόγων στον χρήστη σας ή στο παγκόσμιο $PATH είναι αρκετά απλή. Αυτό σας επιτρέπει να εκτελείτε εντολές και σενάρια που είναι αποθηκευμένα σε μη τυπικές τοποθεσίες χωρίς να χρειάζεται να εισαγάγετε την πλήρη διαδρομή προς το εκτελέσιμο αρχείο.

Οι ίδιες οδηγίες ισχύουν για οποιαδήποτε Διανομή Linux, συμπεριλαμβανομένων των CentOS, RHEL, Debian και Linux Mint.

Μη διστάσετε να αφήσετε ένα σχόλιο εάν έχετε οποιεσδήποτε ερωτήσεις.

Τι είναι? Πολλές από τις εντολές που εισάγετε στη γραμμή εντολών απαιτούν τη χρήση ενός εξωτερικού προγράμματος που φορτώνεται από το σύστημα αρχείων. Για παράδειγμα, εντολές όπως mkdir και wc βρίσκονται στην πραγματικότητα στον φάκελο /bin.

Όταν εισάγετε μια εντολή που το κέλυφος Bash δεν αναγνωρίζει, προσπαθεί να την εκτελέσει ως πρόγραμμα και επιστρέφει ένα σφάλμα εάν δεν βρει ένα πρόγραμμα με αυτό το όνομα. Και αυτό δεν ισχύει μόνο για τις βασικές εντολές που εξετάσαμε, γιατί από τη γραμμή εντολών μπορείτε να εκτελέσετε οποιοδήποτε πρόγραμμα.


Αλλά πώς αν υπάρχει αρχείο Σύστημα Linuxξέρει ποια προγράμματα να τρέξει από ποιους καταλόγους; Το λειτουργικό σύστημα χρησιμοποιεί μια μεταβλητή περιβάλλοντος συστήματος για να καθορίσει ένα υποσύνολο φακέλων προς αναζήτηση όταν λαμβάνει μια άγνωστη εντολή. Αυτή η μεταβλητή ονομάζεται PATH και μπορεί να εμφανιστεί με την ακόλουθη εντολή echo (απαιτείται το σύμβολο $):

Echo $PATH

Η έξοδος αυτής της εντολής θα μοιάζει με τις ακόλουθες επτά απόλυτες διαδρομές φακέλων, χωρισμένες με άνω και κάτω τελείες:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

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

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

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

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

Φυσικά, υποτίθεται ότι το ημερολόγιο είναι ένα απλό αυτόνομο πρόγραμμα που δεν απαιτεί εγκατάσταση, επειδή οι περισσότερες μεγάλες εφαρμογές θα τοποθετήσουν το εκτελέσιμο αρχείο του προγράμματος κάπου στην καθορισμένη διαδρομή σας κατά τη διαδικασία εγκατάστασης. Σαν αυτό Μεταβλητή περιβάλλοντος PATH, απολαύστε το για την υγεία σας!

εξαγωγή PATH=~/opt/bin:$PATH

Εξαγωγή PATH=$PATH:~/opt/bin

9 Λύσεις συλλέγουν ιστό φόρμας για "Πώς να προσθέσω σωστά μια διαδρομή στο PATH;"

Απλά πράγματα

PATH=$PATH:~/opt/bin PATH=~/opt/bin:$PATH

ανάλογα με το αν θέλετε να προσθέσετε ~/opt/bin στο τέλος (για αναζήτηση σε όλους τους άλλους καταλόγους εάν υπάρχει πρόγραμμα με το ίδιο όνομα σε πολλούς καταλόγους) ή στην αρχή (για αναζήτηση πριν από όλους τους άλλους καταλόγους).

Μπορείτε να προσθέσετε πολλές καταχωρήσεις ταυτόχρονα. PATH=$PATH:~/opt/bin:~/opt/node/bin ή οι αλλαγές στην παραγγελία είναι μια χαρά.

Δεν χρειάζεται να κάνετε εξαγωγή εάν η μεταβλητή βρίσκεται ήδη στο περιβάλλον: οποιαδήποτε αλλαγή στην τιμή της μεταβλητής αντικατοπτρίζεται στο περιβάλλον Το PATH βρίσκεται σχεδόν πάντα στο περιβάλλον. Ολα συστήματα unixεγκαταστήστε το πολύ νωρίς (συνήθως στην πρώτη κιόλας διαδικασία, μάλιστα).

Εάν το PATH σας είναι ενσωματωμένο σε διαφορετικά στοιχεία, ενδέχεται να καταλήξετε με διπλότυπες καταχωρίσεις. Δείτε Πώς να προσθέσετε τη διαδρομή στον κατάλογο προέλευσης που θα εντοπιστεί από το Unix, ποια είναι η εντολή; και αφαιρέστε τις διπλότυπες καταχωρήσεις $PATH χρησιμοποιώντας την εντολή awk για να αποφύγετε την προσθήκη διπλότυπων ή την κατάργησή τους.

Πού να βάλετε

Σημειώστε ότι το ~/.bash_rc δεν είναι αναγνώσιμο από κανένα πρόγραμμα και το ~/.bashrc είναι το αρχείο διαμόρφωσης για διαδραστικές παρουσίες bash. Δεν πρέπει να ορίσετε μεταβλητές περιβάλλοντος στο ~/.bashrc. Το σωστό μέρος για να ορίσετε μεταβλητές περιβάλλοντος όπως το PATH είναι το ~/.profile (ή το ~/.bash_profile αν δεν χρειάζεστε κελύφη χωρίς bash). Δείτε ποια είναι η διαφορά μεταξύ τους και ποιο να χρησιμοποιήσω;

Σημειώσεις για τα κοχύλια που δεν είναι bash

Στα bash, ksh και zsh, η εξαγωγή είναι μια ειδική σύνταξη και τόσο το PATH=~/opt/bin:$PATH όσο και το export PATH=~/opt/bin:$PATH κάνουν τα πάντα σωστά. Σε άλλα κελύφη Bourne/POSIX, όπως η παύλα (που είναι /bin/sh σε πολλά συστήματα), η εξαγωγή αναλύεται σαν μια κανονική εντολή, πράγμα που συνεπάγεται δύο διαφορές:

  • Το ~ αναλύεται μόνο στην αρχή μιας λέξης, εκτός από τις αναθέσεις (δείτε την ενότητα "Πώς να προσθέσετε μια διαδρομή σε έναν κατάλογο προέλευσης που θα εντοπιστεί από το Unix, ποια εντολή;").
  • Το $PATH εκτός διπλών εισαγωγικών διακόπτεται εάν το PATH περιέχει κενά ή \[*; ,

Έτσι, σε κελύφη τύπου παύλας, η εξαγωγή PATH=~/opt/bin:$PATH ορίζει το PATH στην κυριολεκτική συμβολοσειρά ~/opt/bin/: ακολουθούμενη από την τιμή του PATH μέχρι την πρώτη θέση. Το PATH=~/opt/bin:$PATH (ασαφής ανάθεση) δεν απαιτεί εισαγωγικά και κάνει το σωστό. Εάν θέλετε να χρησιμοποιήσετε την εξαγωγή σε ένα φορητό σενάριο, πρέπει να γράψετε export PATH="$HOME/opt/bin:$PATH" .

¹ Αυτό δεν ίσχυε στους πυραύλους Bourne (όπως στο πραγματικό κέλυφος Bourne, όχι στα σύγχρονα κοχύλια τύπου POSIX), αλλά είναι απίθανο να συναντήσετε κοχύλια τόσο παλιά στις μέρες μας.

Λειτουργεί ούτως ή άλλως, αλλά δεν κάνουν το ίδιο: τα στοιχεία PATH ελέγχονται από αριστερά προς τα δεξιά. Στο πρώτο παράδειγμα εκτελέσιμα αρχείαστο ~/opt/bin θα έχει προτεραιότητα έναντι εκείνων που είναι εγκατεστημένα στο π.χ. /usr/bin , το οποίο μπορεί να είναι αυτό που θέλετε ή να μην είναι αυτό που θέλετε.

Ιδιαίτερα από την άποψη της ασφάλειας, είναι επικίνδυνο να προσθέτετε μονοπάτια στο μπροστινό μέρος, επειδή εάν κάποιος μπορεί να αποκτήσει πρόσβαση εγγραφής στο ~/opt/bin , θα μπορούσε, για παράδειγμα, να τοποθετήσει άλλα λ που θα χρησιμοποιήσετε στη συνέχεια αντί για / bin/ls χωρίς να το προσέξετε Τώρα φανταστείτε το ίδιο με το ssh ή το πρόγραμμα περιήγησής σας ή την επιλογή σας... (Το ίδιο πράγμα μπορεί να γίνει τρεις φορές στη διαδρομή σας.)

Με μπερδεύει η ερώτηση 2 (καθώς αφαιρέθηκε από την ερώτηση επειδή αφορούσε ένα άσχετο θέμα):

Τι αποτελεσματική μέθοδοςπροσθήκη επιπλέον μονοπατιών σε διαφορετικές γραμμές; Αρχικά σκέφτηκα ότι αυτό μπορεί να κάνει το κόλπο:

Εξαγωγή PATH=$PATH:~/opt/bin εξαγωγή PATH=$PATH:~/opt/node/bin

αλλά δεν συμβαίνει επειδή η δεύτερη εκχώρηση όχι μόνο προσθέτει ~/opt/node/bin αλλά και όλα τα PATH που είχαν εκχωρηθεί προηγουμένως.

Αυτή είναι μια πιθανή λύση:

Εξαγωγή PATH=$PATH:~/opt/bin:~/opt/node/bin

αλλά για αναγνωσιμότητα θα προτιμούσα να έχω έναν προορισμό ανά διαδρομή.

Αν λέτε

PATH=~/opt/bin

Αυτό Ολα,τι θα είναι στο PATH σας. Το PATH είναι απλώς μια μεταβλητή περιβάλλοντος και αν θέλετε να προσθέσετε στο PATH, πρέπει να δημιουργήσετε ξανά τη μεταβλητή με ακριβώς το περιεχόμενο που θέλετε. Οπότε αυτό που δίνεις ως παράδειγμα στην ερώτηση 2 είναι ακριβώς αυτό που θέλεις να κάνεις, εκτός και αν χάνω τελείως το νόημα της ερώτησης.

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

Εξαγωγή PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # προσθήκη προαιρετικών στοιχείων στη διαδρομή για bindir σε $HOME/local/bin $HOME/bin; κάνω εάν [ -d $bindir ]; τότε PATH=$PATH:$(bindir) ολοκληρώθηκε

Το Linux καθορίζει την εκτελέσιμη διαδρομή αναζήτησης από το περιβάλλον $PATH. Για να προσθέσετε τον κατάλογο /data/myscripts στην κορυφή του περιβάλλοντος $PATH, χρησιμοποιήστε τα εξής:

PATH=/data/myscripts:$PATH

Για να προσθέσετε αυτόν τον κατάλογο στο τέλος της διαδρομής, χρησιμοποιήστε την ακόλουθη εντολή:

PATH=$PATH:/data/myscripts

Αλλά οι προηγούμενες δεν αρκούν γιατί όταν ορίζετε μια μεταβλητή περιβάλλοντος μέσα σε ένα σενάριο, αυτή η αλλαγή ισχύει μόνο μέσα στο σενάριο. Αυτός ο περιορισμός περιορίζεται μόνο με δύο τρόπους:

  • Εάν εξάγετε μια μεταβλητή περιβάλλοντος σε ένα σενάριο, είναι αποτελεσματική σε όλα τα προγράμματα που καλούνται από το σενάριο. Σημειώστε ότι αυτό δεν είναι αποτελεσματικό σε ένα πρόγραμμα που ονομάζεται δέσμη ενεργειών.
  • Εάν το πρόγραμμα που καλεί τη δέσμη ενεργειών το κάνει συμπεριλαμβάνοντας αντί να καλεί, οποιεσδήποτε αλλαγές περιβάλλοντος στη δέσμη ενεργειών ισχύουν για το πρόγραμμα κλήσης. Αυτή η συμπερίληψη μπορεί να γίνει χρησιμοποιώντας την εντολή dot ή την εντολή source.

$HOME/myscript.sh πηγή $HOME/myscript.sh

Η συμπερίληψη περιλαμβάνει βασικά το σενάριο "callable" στο σενάριο "call". Αυτό είναι παρόμοιο με το #include στο C. Επομένως, είναι αποτελεσματικό μέσα σε ένα σενάριο ή ένα πρόγραμμα κλήσης. Αλλά φυσικά αυτό δεν είναι αποτελεσματικό για προγράμματα ή σενάρια που καλούνται από το καλούν πρόγραμμα. Για να το κάνετε αποτελεσματικό μέχρι την αλυσίδα κλήσεων, πρέπει να ακολουθήσετε τη ρύθμιση της μεταβλητής περιβάλλοντος χρησιμοποιώντας την εντολή εξαγωγής.

Για παράδειγμα, το πρόγραμμα κελύφους bash περιλαμβάνει τα περιεχόμενα του αρχείου .bash_profile με συμπερίληψη. Έτσι, προσθέτοντας τις ακόλουθες 2 γραμμές στο .bash_profile:

PATH=$PATH:/data/myscripts εξαγωγή PATH

βάζει αποτελεσματικά αυτές τις 2 γραμμές κώδικα σε ένα πρόγραμμα bash. Έτσι, σε μεταβλητή bashΤο $PATH περιλαμβάνει το $HOME/myscript.sh , και λόγω της δήλωσης εξαγωγής, τυχόν προγράμματα που καλούνται από το bash θα τροποποιηθούν στο $PATH. Και δεδομένου ότι όλα τα προγράμματα που εκκινούνται από τη γραμμή εντολών bash καλούνται από το bash, η νέα διαδρομή ισχύει για οτιδήποτε εκκινήσετε από την προτροπή bash.

Η ουσία είναι ότι για να προσθέσετε έναν νέο κατάλογο στη διαδρομή, πρέπει να προσαρτήσετε ή να προσαρτήσετε τον κατάλογο στη μεταβλητή περιβάλλοντος $PATH σε ένα σενάριο που περιλαμβάνεται στο κέλυφος και πρέπει να εξαγάγετε τη μεταβλητή περιβάλλοντος $PATH.

Επιπλέον πληροφορίεςΕδώ

Για αρκετό καιρό έχω κρατήσει μαζί μου δύο λειτουργίες pathadd και pathrm που βοηθούν στην προσθήκη στοιχείων σε μια διαδρομή χωρίς να χρειάζεται να ανησυχώ για διπλασιασμούς.

Το pathadd παίρνει ένα όρισμα διαδρομής και ένα προαιρετικό όρισμα μετά το οποίο εάν προστεθεί θα προστεθεί στο PATH διαφορετικά θα το προσθέσει.

Σχεδόν σε κάθε περίπτωση, εάν προσθέσετε μια διαδρομή, πιθανότατα θέλετε να παρακάμψετε οτιδήποτε υπάρχει ήδη στη διαδρομή, επομένως προτιμώ να προσθέτω από προεπιλογή.

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; τότε αν [ " $2" = "after" ] ; then PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;ζ")" )

Τοποθετήστε τα σε οποιοδήποτε σενάριο θέλετε να αλλάξετε το περιβάλλον PATH και μπορείτε τώρα να το κάνετε.

Pathadd "/foo/bar" pathadd "/baz/bat" μετά την εξαγωγή PATH

Είναι εγγυημένο ότι δεν θα προσθέσετε σε μια διαδρομή εάν υπάρχει ήδη. Εάν τώρα θέλετε το /baz/bat να είναι στην αρχή.

Pathrm "/baz/bat" pathadd "/baz/bat" PATH εξαγωγής

Οποιοδήποτε μονοπάτι μπορεί τώρα να μεταφερθεί στο μέτωπο εάν βρίσκεται ήδη σε μονοπάτι χωρίς διπλασιασμό.

Δεν μπορώ να μιλήσω για άλλες διανομές, αλλά το Ubuntu έχει ένα αρχείο, /etc/environment, που είναι η τυπική διαδρομή αναζήτησης για όλους τους χρήστες. Δεδομένου ότι ο υπολογιστής μου χρησιμοποιείται μόνο από εμένα, βάζω όσους καταλόγους θέλω στο δρόμο μου, αρκεί να είναι μια προσωρινή προσθήκη που βάζω στο σενάριο.

Εδώ είναι η λύση μου:

PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: "!x[$0]++" | sed "s/\(.*\).\(1\)/\1 /")

Ωραία ελαφριά επένδυση που δεν αφήνει ίχνη:

Για μένα (σε Mac OS X 10.9.5) η προσθήκη του ονόματος διαδρομής (π.χ. /mypathname) στο αρχείο /etc/paths λειτούργησε πολύ καλά.

Πριν από την επεξεργασία, επιστρέφεται το echo $PATH:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

Μετά την επεξεργασία του /etc/paths και την επανεκκίνηση του κελύφους, η μεταβλητή $PATH προστίθεται με το /pathname . Πράγματι, το echo $PATH επιστρέφει:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

Αυτό που συνέβη ήταν ότι το /mypathname προστέθηκε στο $PATH .

Για να προσθέσετε μια νέα διαδρομή στο περιβάλλον PATH PATH:

Εξαγωγή PATH=$PATH:/new-path/

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

  • Κέλυφος Bash: ~/.bash_profile, ~/.bashrc ή προφίλ
  • Korn Shell: ~/.kshrc ή .profile
  • Z Shell: ~/.zshrc ή .zprofile

Για παράδειγμα

# export PATH=$PATH:/root/learning/bin/ # source ~/.bashrc # echo $PATH

Μπορείτε να δείτε την παρεχόμενη διαδρομή στην παραπάνω έξοδο.

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

Στο σημερινό σύντομο άρθρο θα δούμε ποια είναι η διαδρομή προς ένα αρχείο Linux, ποια μπορεί να είναι, πώς να το γράψουμε σωστά και πολλά άλλα. Εάν είχατε δυσκολίες με αυτό πριν, τότε μετά την ανάγνωση του άρθρου όλα θα γίνουν απολύτως ξεκάθαρα.

Διαδρομές αρχείων στο Linux

Το σύστημα αρχείων Linux είναι πολύ διαφορετικό από τα Windows. Δεν θα εξετάσουμε τη δομή του· αυτό έγινε νωρίτερα. Θα επικεντρωθούμε στην εργασία με αρχεία.

Η πιο σημαντική διαφορά είναι ότι η διεύθυνση του αρχείου δεν ξεκινά από τη μονάδα δίσκου, για παράδειγμα, C:\ ή D:\ όπως συμβαίνει στα Windows, αλλά από τη ρίζα, τον κατάλογο του ριζικού συστήματος στον οποίο είναι συνδεδεμένοι όλοι οι άλλοι. Η διεύθυνσή του - /. Και εδώ πρέπει να μιλήσουμε για διευθύνσεις. Οι διαδρομές αρχείων Linux χρησιμοποιούν κάθετο "/" προς τα εμπρός για να διαχωρίσουν τους καταλόγους στη διεύθυνση, και αυτό είναι διαφορετικό από αυτό που έχετε συνηθίσει να βλέπετε στα Windows - \.

Για παράδειγμα, εάν σε Τα Windows γεμάταη διαδρομή προς το αρχείο στην επιφάνεια εργασίας έμοιαζε με C:\Users\Sergiy\Desktop\, τότε η διαδρομή του αρχείου στο Linux θα ήταν απλώς /home/sergiy/desktop/. Με αυτό, όλα είναι απλά και ξεκάθαρα μέχρι στιγμής. Αλλά τα προβλήματα προκύπτουν περαιτέρω.

Στο λειτουργικό σύστημα Linux, μπορεί να υπάρχουν διάφοροι τύποι διαδρομών αρχείων. Ας δούμε ποιες διαδρομές υπάρχουν στο Linux:

  • Πλήρης, απόλυτη διαδρομή linux από τη ρίζα του συστήματος αρχείων- έχετε ήδη δει αυτή τη διαδρομή στο παραπάνω παράδειγμα, ξεκινά από τη ρίζα "/" και περιγράφει ολόκληρη τη διαδρομή προς το αρχείο.
  • Σχετική διαδρομή Linux- αυτή είναι η διαδρομή προς το αρχείο σε σχέση με τον τρέχοντα φάκελο· τέτοιες διαδρομές συχνά προκαλούν σύγχυση.
  • Διαδρομή σε σχέση με τον αρχικό φάκελο του τρέχοντος χρήστη.- διαδρομή στο σύστημα αρχείων, αλλά όχι από τη ρίζα, αλλά από τον φάκελο του τρέχοντος χρήστη.

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

Για παράδειγμα, έχουμε έναν κατάλογο όπως αυτός στον αρχικό μας φάκελο με τέσσερα αρχεία σε αυτόν:

Έτσι θα μοιάζει η πλήρης διαδρομή Linux προς ένα από τα αρχεία:

ls /home/sergiy/tmp/file1

Αυτή είναι ήδη μια σχετική διαδρομή Linux, η οποία ξεκινά από τον αρχικό φάκελο, ορίζεται ως ~/. Σημείωση, όχι ~, δηλαδή ~/. Στη συνέχεια, μπορείτε να καθορίσετε υποφακέλους, στην περίπτωσή μας tmp:

Λοιπόν, ή η διαδρομή του αρχείου στο Linux, σε σχέση με τον τρέχοντα φάκελο:

Ο πρώτος σύνδεσμος δείχνει στον τρέχοντα φάκελο (.), ο δεύτερος (..) δείχνει σε έναν υψηλότερο φάκελο. Αυτό ανοίγει ακόμη μεγαλύτερες δυνατότητες για πλοήγηση σε κατάλογο. Για παράδειγμα, για να αναφερθείτε σε ένα αρχείο στον τρέχοντα φάκελο, μπορείτε να χρησιμοποιήσετε την ακόλουθη κατασκευή:

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

Τέτοιες κατασκευές μπορούν να προκύψουν αρκετά συχνά κατά τη μεταγλώττιση προγραμμάτων. Μπορείτε να χρησιμοποιήσετε όλα αυτά τα σύμβολα και τις διαδρομές αρχείων linux όχι μόνο στο τερματικό, αλλά και σε οποιοδήποτε διαχείριση αρχείων, που μπορεί να είναι πολύ βολικό.

Αλλά τερματικό Linuxπαρέχει ακόμη μεγαλύτερες ευκαιρίες. Μπορείτε να χρησιμοποιήσετε απλούς χαρακτήρες μπαλαντέρ απευθείας σε διευθύνσεις αρχείων ή καταλόγου. Για παράδειγμα, μπορείτε να απαριθμήσετε όλα τα αρχεία που ξεκινούν με f:

Ή μπορείτε ακόμη και να κάνετε αναζήτηση όχι μόνο στον φάκελο tmp, αλλά σε οποιονδήποτε υποφάκελο του αρχικού σας φακέλου:

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

συμπεράσματα

Αυτό είναι όλο. Τώρα ξέρετε όλα όσα χρειάζεστε όχι μόνο για να γράψετε σωστά τη διαδρομή προς την οποία μπορείτε αρχείο linux, αλλά και να εκτελέσετε πιο σύνθετες ενέργειες, όπως αναζήτηση αρχείων ή πλοήγηση σε καταλόγους χρησιμοποιώντας την εντολή cd. Εάν έχετε οποιεσδήποτε ερωτήσεις, ρωτήστε στα σχόλια!

Σχετικές αναρτήσεις:


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

Ετσι:

Εξαγωγή PATH=~/opt/bin:$PATH

Εξαγωγή PATH=$PATH:~/opt/bin

11 απαντήσεις

Απλό υλικό

PATH=$PATH:~/opt/bin PATH=~/opt/bin:$PATH

ανάλογα με το αν θέλετε να προσθέσετε τον κωδικό ~/opt/bin στο τέλος (για αναζήτηση σε όλους τους άλλους καταλόγους εάν υπάρχει πρόγραμμα με το ίδιο όνομα σε πολλούς καταλόγους) ή στην αρχή (για αναζήτηση πριν από όλους τους άλλους καταλόγους).

Μπορείτε να προσθέσετε πολλές καταχωρήσεις ταυτόχρονα. PATH=$PATH:~/opt/bin:~/opt/node/bin ή οι αλλαγές στην παραγγελία είναι μια χαρά.

Δεν χρειάζεται να κάνετε εξαγωγή εάν η μεταβλητή βρίσκεται ήδη στο περιβάλλον: οποιαδήποτε αλλαγή στην τιμή της μεταβλητής αντικατοπτρίζεται στο περιβάλλον.¹ PATH είναι σχεδόν πάντα στο περιβάλλον. όλα τα συστήματα unix το εγκαθιστούν πολύ νωρίς (συνήθως στην πρώτη κιόλας διαδικασία, μάλιστα).

Εάν το PATH σας δημιουργείται από πολλά διαφορετικά στοιχεία, μπορεί να καταλήξετε με διπλότυπες καταχωρίσεις. Δείτε Πώς να προσθέσετε μια διαδρομή στον αρχικό σας κατάλογο που θα εντοπιστεί από το Unix, ποια εντολή; και Καταργήστε τις διπλότυπες καταχωρήσεις $PATH χρησιμοποιώντας την εντολή awk για να αποφύγετε τα διπλότυπα ή να τα αφαιρέσετε.

Πού να βάλετε

Σημειώστε ότι το ~/.bash_rc δεν είναι αναγνώσιμο από κανένα πρόγραμμα και το ~/.bashrc είναι το αρχείο διαμόρφωσης για διαδραστικές παρουσίες bash. Δεν πρέπει να ορίσετε μεταβλητές περιβάλλοντος στο ~/.bashrc. Το σωστό μέρος για να ορίσετε μεταβλητές περιβάλλοντος όπως το PATH είναι το ~/.profile (ή το ~/.bash_profile αν δεν σας αρέσουν τα κελύφη εκτός από το bash). Δείτε Ποια είναι η διαφορά μεταξύ τους και ποια πρέπει να χρησιμοποιήσω;

Σημειώσεις για τα κοχύλια που δεν είναι bash

Στα bash, ksh και zsh, η εξαγωγή είναι μια ειδική σύνταξη και τόσο το PATH=~/opt/bin:$PATH όσο και το export PATH=~/opt/bin:$PATH κάνουν το σωστό. Σε άλλα κελύφη Bourne/POSIX, όπως η παύλα (που είναι /bin/sh σε πολλά συστήματα), η εξαγωγή αναλύεται σαν μια κανονική εντολή, πράγμα που συνεπάγεται δύο διαφορές:

  • Το ~ αναλύεται μόνο στην αρχή μιας λέξης, εκτός από τις αναθέσεις (δείτε Πώς μπορώ να προσθέσω μια διαδρομή οικιακού καταλόγου που θα εντοπιστεί από το Unix που απαιτεί την εντολή; ;
  • $PATH εξωτερικό διπλά εισαγωγικάδιακόπτεται εάν το PATH περιέχει κενά ή \[*; .

Έτσι, σε κελύφη όπως η παύλα, η εξαγωγή PATH=~/opt/bin:$PATH ορίζει το PATH στην κυριολεκτική συμβολοσειρά ~/opt/bin/: ακολουθούμενη από την τιμή PATH μέχρι την πρώτη θέση. Το PATH=~/opt/bin:$PATH (απλή ανάθεση) δεν απαιτεί εισαγωγικά και κάνει τα πάντα σωστά. Εάν θέλετε να χρησιμοποιήσετε την εξαγωγή σε φορητό σενάριο, πρέπει να γράψετε export PATH="$HOME/opt/bin:$PATH" ή PATH=~/opt/bin:$PATH εξαγωγή PATH (ή PATH=$HOME/opt /bin: $PATH εξαγωγή PATH για φορητότητα ακόμη και στο κέλυφος Bourne, το οποίο δεν δέχεται εξαγωγή var=value και δεν έκανε επέκταση tilde).

¹ Αυτό δεν ίσχυε στα κοχύλια Bourne (όπως στο πραγματικό κέλυφος Bourne, όχι στα σύγχρονα κοχύλια τύπου POSIX), αλλά είναι απίθανο να συναντήσετε κοχύλια τόσο παλιά αυτές τις μέρες. Υπο>

Είτε έτσι είτε αλλιώς λειτουργεί, αλλά δεν κάνουν το ίδιο: τα στοιχεία PATH ελέγχονται από αριστερά προς τα δεξιά. Στο πρώτο παράδειγμα, τα εκτελέσιμα στο ~/opt/bin θα έχουν προτεραιότητα έναντι αυτών που είναι εγκατεστημένα, για παράδειγμα, στο /usr/bin , το οποίο μπορεί να είναι αυτό που θέλετε ή να μην είναι αυτό που θέλετε.

Ειδικότερα, είναι επικίνδυνο από την άποψη της ασφάλειας να προσθέτετε διαδρομές στο μπροστινό μέρος, επειδή εάν κάποιος μπορεί να αποκτήσει πρόσβαση εγγραφής στο ~/opt/bin , μπορεί να βάλει ένα άλλο ls, για παράδειγμα, το οποίο πιθανότατα θα χρησιμοποιήσετε αντί του /bin/ls χωρίς να το προσέξω. Τώρα φανταστείτε το ίδιο για το ssh ή το πρόγραμμα περιήγησής σας ή την επιλογή σας... (Το ίδιο πράγμα τρεις φορές βάλτε στο δρόμο σας.)

Έχω μπερδευτεί με την ερώτηση 2 (αφού αφαιρέθηκε από την ερώτηση επειδή είχε σχέση με το μη σχετικό πρόβλημα):

Ποιος είναι ένας αποτελεσματικός τρόπος για να προσθέσετε επιπλέον μονοπάτια σε διαφορετικές γραμμές; Αρχικά σκέφτηκα ότι αυτό μπορεί να κάνει το κόλπο:

Εξαγωγή PATH=$PATH:~/opt/bin εξαγωγή PATH=$PATH:~/opt/node/bin

Αλλά αυτό δεν συμβαίνει επειδή η δεύτερη εκχώρηση όχι μόνο προσθέτει ~/opt/node/bin αλλά και την προηγουμένως εκχωρημένη PATH .

Αυτή είναι μια πιθανή λύση:

Εξαγωγή PATH=$PATH:~/opt/bin:~/opt/node/bin

Αλλά για αναγνωσιμότητα θα προτιμούσα να έχω έναν προορισμό ανά διαδρομή.

Αν λέτε

PATH=~/opt/bin

Αυτό όλα, που θα είναι στο PATH σας. Το PATH είναι απλώς μια μεταβλητή περιβάλλοντος και αν θέλετε να προσθέσετε στο PATH, πρέπει να δημιουργήσετε ξανά τη μεταβλητή με ακριβώς το περιεχόμενο που θέλετε. Δηλαδή, αυτό που δίνεις ως παράδειγμα στην ερώτηση 2 είναι ακριβώς αυτό που θέλεις να κάνεις, εκτός αν έχασα τελείως το νόημα της ερώτησης.

Χρησιμοποιώ και τις δύο φόρμες στον κώδικά μου. Έχω ένα γενικό προφίλ που εγκαθιστώ σε κάθε μηχάνημα στο οποίο εργάζομαι που μοιάζει με αυτό, για να φιλοξενήσει πιθανούς καταλόγους που λείπουν:

Εξαγωγή PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # προσθήκη προαιρετικών στοιχείων στη διαδρομή για bindir σε $HOME/local/bin $HOME/bin; κάνω εάν [ -d $bindir ]; τότε PATH=$PATH:$(bindir) ολοκληρώθηκε

Το Linux ορίζει την εκτελέσιμη διαδρομή αναζήτησης με τη μεταβλητή περιβάλλοντος $PATH. Για να προσθέσετε τον κατάλογο /data/myscripts στην αρχή της μεταβλητής περιβάλλοντος $PATH, χρησιμοποιήστε τα εξής:

PATH=/data/myscripts:$PATH

Για να προσθέσετε αυτόν τον κατάλογο στο τέλος της διαδρομής, χρησιμοποιήστε την ακόλουθη εντολή:

PATH=$PATH:/data/myscripts

Αλλά οι προηγούμενες δεν αρκούν γιατί όταν ορίζετε μια μεταβλητή περιβάλλοντος μέσα σε ένα σενάριο, αυτή η αλλαγή ισχύει μόνο μέσα στο σενάριο. Αυτός ο περιορισμός περιορίζεται με δύο τρόπους:

  • Εάν εξάγετε μια μεταβλητή περιβάλλοντος μέσα σε μια δέσμη ενεργειών, αυτή είναι αποτελεσματική σε οποιοδήποτε πρόγραμμα που καλείται από το σενάριο. Σημειώστε ότι αυτό δεν είναι αποτελεσματικό στο πρόγραμμα που κάλεσε το σενάριο.
  • Εάν το πρόγραμμα που καλεί τη δέσμη ενεργειών το κάνει συμπεριλαμβάνοντας αντί να καλεί, οποιεσδήποτε αλλαγές περιβάλλοντος στη δέσμη ενεργειών ισχύουν για το πρόγραμμα κλήσης. Αυτή η συμπερίληψη μπορεί να γίνει χρησιμοποιώντας την εντολή dot ή την εντολή source.

$HOME/myscript.sh πηγή $HOME/myscript.sh

Η συμπερίληψη περιλαμβάνει βασικά το σενάριο "callable" στο σενάριο "call". Αυτό είναι παρόμοιο με το #include στο C. Επομένως, είναι αποτελεσματικό μέσα σε ένα σενάριο ή ένα πρόγραμμα κλήσης. Αλλά φυσικά αυτό δεν είναι αποτελεσματικό για προγράμματα ή σενάρια που καλούνται από το καλούν πρόγραμμα. Για να το κάνετε αποτελεσματικό μέχρι την αλυσίδα κλήσεων, πρέπει να ακολουθήσετε τη ρύθμιση της μεταβλητής περιβάλλοντος χρησιμοποιώντας την εντολή εξαγωγής.

Για παράδειγμα, το πρόγραμμα κελύφους bash περιλαμβάνει τα περιεχόμενα του αρχείου .bash_profile με συμπερίληψη. Βάλτε λοιπόν τις ακόλουθες 2 γραμμές στο .bash_profile:

PATH=$PATH:/data/myscripts εξαγωγή PATH

βάζει αποτελεσματικά αυτές τις 2 γραμμές κώδικα σε ένα πρόγραμμα bash. Έτσι, στο bash, η μεταβλητή $PATH περιλαμβάνει την $HOME/myscript.sh και λόγω της δήλωσης εξαγωγής, τυχόν προγράμματα που καλούνται από το bash τροποποιούν τη μεταβλητή $PATH. Και επειδή όλα τα προγράμματα που εκκινείτε από τη γραμμή εντολών bash καλούνται από το bash, η νέα διαδρομή ισχύει για οτιδήποτε εκκινήσετε από τη γραμμή εντολών bash.

Η ουσία είναι ότι για να προσθέσετε έναν νέο κατάλογο στη διαδρομή, πρέπει να προσαρτήσετε ή να προσαρτήσετε τον κατάλογο στη μεταβλητή περιβάλλοντος $PATH σε ένα σενάριο που περιλαμβάνεται στο κέλυφος και πρέπει να εξαγάγετε τη μεταβλητή περιβάλλοντος $PATH.

Έχω κρατήσει μαζί μου για αρκετό καιρό δύο λειτουργίες pathadd και pathrm που βοηθούν στην προσθήκη στοιχείων σε μια διαδρομή χωρίς να ανησυχώ για διπλασιασμούς.

Το pathadd παίρνει ένα όρισμα διαδρομής και ένα προαιρετικό μετά το όρισμα, το οποίο εάν προστεθεί θα προστεθεί στο PATH, διαφορετικά θα το προσθέσει.

Σε κάθε περίπτωση, εάν προσθέτετε μια διαδρομή, πιθανότατα θέλετε να παρακάμψετε οτιδήποτε υπάρχει ήδη στη διαδρομή, επομένως προτιμώ να προσθέτω από προεπιλογή.

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; τότε αν [ " $2" = "after" ] ; then PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;ζ")" )

Τοποθετήστε τα σε όποιο σενάριο θέλετε για να αλλάξετε το περιβάλλον του PATH και τελειώσατε.

Pathadd "/foo/bar" pathadd "/baz/bat" μετά την εξαγωγή PATH

Είναι εγγυημένο ότι δεν θα προσθέσετε μια διαδρομή εάν υπάρχει ήδη. Εάν θέλετε να τρέξει πρώτα το /baz/bat.

Pathrm "/baz/bat" pathadd "/baz/bat" PATH εξαγωγής

Οποιοδήποτε μονοπάτι μπορεί τώρα να μετακινηθεί προς τα εμπρός εάν βρίσκεται ήδη σε μονοπάτι χωρίς διπλασιασμό.

Αλεξίσφαιρη μέθοδος προσθήκης/προετοιμασίας

Υπάρχουν πολλά ζητήματα που εμπλέκονται στην επιλογή προσθήκης και προσθήκης. Πολλά από αυτά καλύπτονται σε άλλες απαντήσεις, οπότε δεν θα τα επαναλάβω εδώ.

Το σημαντικό σημείο είναι ότι ακόμα κι αν τα σενάρια συστήματος δεν χρησιμοποιούν αυτό (αναρωτιέμαι γιατί) *1, είναι ένας αλεξίσφαιρος τρόπος για να προσθέσετε μια διαδρομή (π.χ. $HOME/bin) στη μεταβλητή περιβάλλοντος PATH

PATH="$(PATH:+$(PATH):)$HOME/bin"

για προσθήκη (αντί για PATH="$PATH:$HOME/bin") και

PATH="$HOME/bin$(PATH:+:$(PATH))"

για προσθήκη (αντί για PATH="$HOME/bin:$PATH")

Αυτό αποφεύγει μια ψευδή άνω και κάτω τελεία όταν το $PATH είναι αρχικά άδειο, το οποίο μπορεί να έχει ανεπιθύμητες παρενέργειες και μπορεί να είναι εφιάλτης για εύρεση (αυτή η απάντηση αναφέρεται εν συντομία στην περίπτωση awk-way).

$(παράμετρος:+λέξη)

Εάν η παράμετρος είναι μηδενική ή μη καθορισμένη, δεν αντικαθίσταται τίποτα, διαφορετικά αντικαθίσταται λέξη λέξη.

Άρα το $(PATH:+$(PATH):) επεκτείνεται σε: 1) τίποτα εάν το PATH είναι μηδενικό ή μη καθορισμένο, 2) $(PATH): εάν έχει οριστεί PATH.

Σημείωση. Αυτό είναι για bash.

*1 Μόλις διαπίστωσα ότι σενάρια όπως το devtoolset-6/enable χρησιμοποιούν αυτό, $ cat /opt/rh/devtoolset-6/enable # Γενικές μεταβλητές περιβάλλοντος εξαγωγή PATH=/opt/rh/devtoolset-6/root/usr /bin $(PATH:+:$(PATH)) ...

Δεν μπορώ να μιλήσω για άλλες διανομές, αλλά το Ubuntu έχει ένα αρχείο, /etc/environment, που είναι η προεπιλεγμένη διαδρομή αναζήτησης για όλους τους χρήστες. Δεδομένου ότι ο υπολογιστής μου χρησιμοποιείται μόνο από εμένα, βάζω ό,τι καταλόγους θέλω στη διαδρομή μου εκεί εκτός και αν είναι μια προσωρινή προσθήκη που έβαλα στο σενάριο.

Για μένα (σε Mac OS X 10.9.5) η προσθήκη του ονόματος διαδρομής (π.χ. /mypathname) στο αρχείο /etc/paths λειτούργησε πολύ καλά.

Πριν από την επεξεργασία, επιστρέφεται το echo $PATH:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

Μετά την επεξεργασία του /etc/paths και την επανεκκίνηση του κελύφους, η μεταβλητή $PATH προστίθεται με το /pathname . Πράγματι, το echo $PATH επιστρέφει:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

Αυτό που συνέβη ήταν ότι το /mypathname προστέθηκε στη μεταβλητή $PATH.