Was sind "$ PATH" und "~ / bin"? Wie kann ich persönliche Skripte haben?


29

Was ist $PATH?

Wie kann ich Befehle / Programme haben, die nur für mich verfügbar sind?
Ich habe diesen bereits ~/binerwähnten Pfad gesehen , aber wofür wird er verwendet und wie verwende ich ihn?


Ich experimentiere etwas, weil dies mehr FAQ oder Wiki-Material als eine "echte Frage" ist. Dies wurde veranlasst, weil ich ~ / bin in einer vorherigen Antwort erwähnt habe (in der verlinkten Seitenleiste rechts) und jemand kommentierte, wie man es zu PATH hinzufügt: Anstelle von kurzen Kommentaren können wir jetzt auf diesen Beitrag verlinken, wenn ~ / bin ist erwähnt.

Antworten:


26

$ PATH ist eine Umgebungsvariable, die zum Nachschlagen von Befehlen verwendet wird. Das ~ ist Ihr Ausgangsverzeichnis, also ist ~ / bin / home / user / bin; Es ist ein normales Verzeichnis.

Wenn Sie beispielsweise "ls" in einer Shell ausführen, führen Sie tatsächlich das Programm / bin / ls aus. Der genaue Speicherort kann je nach Systemkonfiguration abweichen. Dies geschieht, weil sich / bin in Ihrem $ PATH befindet.

So können Sie den Pfad anzeigen und feststellen, wo sich ein bestimmter Befehl befindet:

$ echo $PATH
/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:...
$ which ls     # searches $PATH for an executable named "ls"
/bin/ls
$ ls           # runs /bin/ls
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
$ /bin/ls      # can also run directly
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...

Um Ihr eigenes privates bin-Verzeichnis zu haben, müssen Sie es nur zum Pfad hinzufügen. Bearbeiten Sie dazu ~ / .profile (eine versteckte Datei), um die folgenden Zeilen einzuschließen. Wenn die Zeilen kommentiert sind, müssen Sie sie nur auskommentieren. wenn sie schon da sind, bist du fertig!

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ]; then
  PATH="$HOME/bin:$PATH"
fi

Jetzt müssen Sie Ihr ~ / bin-Verzeichnis erstellen. Da .profile bei der Anmeldung ausgeführt wird und nur ~ / bin hinzufügt, wenn es zu diesem Zeitpunkt vorhanden ist, müssen Sie sich erneut anmelden, um den aktualisierten PFAD anzuzeigen.

Lass es uns testen:

$ ln -s $(which ls) ~/bin/my-ls   # symlink
$ which my-ls
/home/user/bin/my-ls
$ my-ls -l ~/bin/my-ls
lrwxrwxrwx 1 user user 7 2010-10-27 18:56 my-ls -> /bin/ls
$ my-ls          # lookup through $PATH
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
$ ~/bin/my-ls    # doesn't use $PATH to lookup
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...

3
Bei der Verwendung ist zu beachten, dass nur Befehle im Dateisystem gefunden werden, bei denen es sich um Binärdateien handelt. Es werden keine eingebauten Shell-Befehle, Aliase oder Funktionen gemeldet. Oft ist es nützlicher zu typesehen, wie ein tatsächlicher Befehl von der Shell aufgelöst wird. Beispiel: which echound type echomeldet verschiedene Dinge, whichgibt '/ bin / echo' zurück, aber 'type' gibt zurück, dass es sich um eine eingebaute Shell handelt, die die Shell der Datei in '/ bin' vorziehen wird.
Steve Beattie

@Steve Beattie, +1. whichwird besser durch typeoder commandin interaktiven Shells ersetzt und ist in Skripten völlig nutzlos.
Geirha

Eine Sache zu beachten, die ich gerade bemerkt habe - $HOMEVariable in $PATHaus irgendeinem Grund funktioniert nicht, dh man muss ~stattdessen Zeichen verwenden.
Hi-Angel

19

In Bezug auf ~/binund Befehle / Programme nur für Ihren Benutzer verfügbar

Neuere Ubuntu-Versionen enthalten das ~/binVerzeichnis in Ihrem Verzeichnis $PATH, jedoch nur, wenn das ~/binVerzeichnis vorhanden ist.

Wenn es nicht existiert:

  1. Stellen Sie sicher, dass Ihre ~/.profilefolgende Zeilengruppe enthält (die Standardeinstellung ist ~/.profilebereits vorhanden):

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    
  2. Erstellen Sie das ~/binVerzeichnis:

    mkdir -p ~/bin
    
  3. Starten Sie Ihren Computer neu oder erzwingen Sie das erneute Lesen von Bash ~/.profile:

    exec -l bash
    

Danke für den "Neustart oder exec -l bash" -Tipp. Was macht die -lFlagge? Ich finde keine Erklärung in man exec.
Evanrmurphy

3
exec -lwird bash als Login-Shell ausführen [ wiki.bash-hackers.org/commands/builtin/exec] . Kurz gesagt, es zwingt Bash, neu zu lesen /etc/profileund ~/.profile. Nur ausgeführt exec bashwird nur neu gelesen ~/.bashrc.
Danilo Piazzalunga
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.