Was ist PATH unter Mac OS?

12

Was ist das PATHin einem Mac OS? Ich habe es verwendet, um globale Befehlszeilentools zu installieren, aber die einzige Dokumentation, die ich gefunden habe, sind Tutorials, um genau das zu tun, ohne wirklich zu erklären, was unter der Haube passiert. Ich habe auch keine relevante Seite auf Wikipedia gefunden .

Also, was ist der Zweck PATHund was ist der Unterschied zwischen /etc/pathsund ~/.bash_profile**?

In meiner pathsDatei sehe ich beispielsweise Folgendes:

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

Aber in meinem ~/.bash_profilesehe ich das:

# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH

Ist dies nur eine benutzerspezifische Ergänzung der pathsDatei? Was ist all das Zeug in paths, wie /usr/bin?

gwg
quelle
2
Bitte kombinieren Sie nicht mehrere Fragen in einem einzigen Beitrag. Jede Ihrer Fragen wäre hier separat willkommen, aber nicht alle zusammen so. Bitte reduzieren Sie dies auf eine einzige Frage. Sie könnten 1 und 2 kombinieren, aber die anderen haben nichts speziell mit PATH zu tun. 3 wird hier beantwortet 4 wird hier erklärt und 5 macht leider nicht viel Sinn. Ihre Bonusfrage lautet auch nicht: Welche Dateien sind binär? Skripte sind nicht.
Terdon
Ich habe meine Frage nach unten bearbeitet. Außerdem fand ich diese Links hilfreich. Vielen Dank.
GWG

Antworten:

15

1. Was ist der Zweck von PATH?

PATHist eine Umgebungsvariable , die eine durch Doppelpunkte getrennte Liste von Verzeichnissen enthält, in denen Ihre Shell nach ausführbaren Dateien sucht, die Sie in der Befehlszeile benennen, ohne einen expliziten Pfad zu diesen anzugeben (wie in Ihrem jsdocBeispiel). Wenn also Sie PATHhaben

/usr/bin:/bin:/home/bin

Dann wird in diesen Verzeichnissen (in dieser Reihenfolge) nach jeder ausführbaren Datei gesucht, die Sie beim Namen aufrufen, und die erste gefundene ausführbare Datei ist die ausgeführte.

2. Was ist der Unterschied zwischen / etc / path und ~ / .bash_profile?

Nach dieser Frage auf ServerFault , /etc/pathswird eingestellt , PATHglobal (dh systemweit für alle Benutzer) , während ~/.bash_profileauf Set pro-Benutzereinstellungen verwendet wird (wo ~wird die Home - Verzeichnis). Was in geschrieben ist, .bash_profilekann entweder zum globalen PATHvon hinzufügen /etc/pathsoder es vollständig überschreiben.

Für die Aufzeichnung /etc/pathsscheint es eine Besonderheit des MAC-Betriebssystems zu sein: Ich bin zumindest unter GNU / Linux nicht darauf gestoßen.

Joseph R.
quelle
Ich habe sie gerade bearbeitet, aber danke, dass Sie alle beantwortet haben!
GWG
@ggundersen Ich habe meine Antwort auf Ihre bearbeitete Frage zugeschnitten.
Joseph R.
@ggundersen Vielleicht möchten Sie auch meine Antwort und die darin enthaltenen Links /etc/pathsunter OSX lesen .
Terdon
7

Was ist der Zweck von PATH?

So findet Ihre Shell Programme. Wenn Sie lsbeispielsweise eingeben, wird ein Programm ausgeführt, lsdas /binauf den meisten Systemen, einschließlich Mac OS X, ausgeführt wird. Ihre Shell kann dies nur finden, weil /bines sich in der PATH.

Die Shell sucht von PATHlinks nach rechts nach Programmen . Wenn sich lsauf Ihrem System zwei Programme befinden und sich beide in Ihrem Verzeichnis befinden PATH, wird das Programm in dem Verzeichnis gefunden, das zuerst in Ihrem aufgeführt ist PATH.

Was ist der Unterschied zwischen / etc / path und ~ / .bash_profile?

Eingestellte Pfade /etc/pathswerden PATHbeim Start in allen Shells unter Mac OS X zum Start hinzugefügt.

~/.bash_profileist nur eines von mehreren Shell-Skripten, die Bash beim Start ausführt, und einige davon sind Bash-spezifisch. Wenn Sie also Ihre Shell ändern, wird Mac OS X ebenfalls ausgeliefert tcshund zshbeispielsweise werden Änderungen vorgenommen, /etc/bashrcdie nicht für Ihre neue Shell gelten.

Es handelt sich auch /etc/pathsum eine Konfigurationsdatei auf Systemebene, die ~/.bash_profilepro Benutzer erstellt wird. Wenn Sie mehrere interaktive Benutzer auf Ihrem Mac eingerichtet hätten, möchten /etc/pathsSie keine Verzeichnisse hinzufügen , die nicht in allen Benutzern angezeigt werden sollen PATH. Gleiches gilt /etc/bashrc, außer dass dies natürlich nur für Benutzer gilt, die Bash als Shell verwenden.

Was ist der Unterschied zwischen PATH und $ PATH und $ {PATH}?

Normalerweise sehen Sie die Variable nur ohne Siegel, wenn Sie die Variable einstellen. FOO=barSetzt die FOOUmgebungsvariable auf die Zeichenfolge bar. Wenn Sie eingeben set, zeigt die Shell alle Umgebungsvariablen an. In diesem Fall wird die Variable auch ohne Siegel angezeigt.

$PATHund ${PATH}sind in der Regel austauschbar. Sie weisen die Shell an, den PATHWert der aktuellen Variablen direkt zu erweitern . Der Unterschied hängt damit zusammen, wie und wo Sie sie verwenden. Beispielsweise:

$ FOO=bar
$ echo $FOO
bar
$ echo $FOOx

$ echo ${FOO}x
barx

Im zweiten echoBefehl gibt die Shell nichts aus, da sie die Shell auffordert, eine Variable namens aufzurufen FOOx, die nicht vorhanden ist. Die Shell behandelt nicht vorhandene Variablen als leer. Da der dritte echodie geschweifte Klammer-Syntax verwendet, kann die Shell sehen, dass Sie die FOOVariable anfordern und dass dies xnur ein weiteres Zeichen ist, das Sie unmittelbar danach drucken möchten.

Es gibt übrigens eine andere Möglichkeit, den gleichen Effekt ohne geschweifte Klammern zu erzielen:

$ echo "$FOO"x
barx

Umgebungsvariablen werden in doppelte Anführungszeichen erweitert, und die Anführungszeichen trennen die xvon der Variablenerweiterung, sodass die Shell das Richtige tut.

Ich verwende die FOOUmgebungsvariable hier nur zur Verdeutlichung. Alles, was ich oben geschrieben habe, gilt genauso gut PATH, da es sich nur um eine andere Umgebungsvariable handelt. Die Beispieltexte wären nur viel länger.

Was bedeutet Export PATH? Wann exportieren wir?

Wenn Sie im obigen FOOBeispiel ein anderes Programm ausführen, wird die FOOVariable nicht angezeigt, da sie nicht exportiert wird. Es lebt nur innerhalb dieser einen Shell-Instanz:

$ echo $FOO
bar
$ bash
$ echo $FOO

$ exit
$ export FOO
$ bash
$ echo $FOO
bar

Wenn ich zum ersten Mal eine neue bashShell unter der bereits verwendeten ausführe und dann versuche, den Wert von FOOanzuzeigen, wird ein Leerzeichen angezeigt, da FOOes nicht exportiert wurde, damit Unterprogramme es sehen können. Dann habe ich die zweite bashInstanz beendet, exportiert, basherneut ausgeführt, und jetzt sieht die zweite Instanz den Wert von FOO.

Sie verwenden diese Option, exportwenn Unterprogramme die in der Shell festgelegten Werte anzeigen sollen, und verwenden sie nicht, wenn dies nicht geschehen soll.

Normalerweise exportiere ich keine temporären Variablen in Shell-Skripten, da ich nicht möchte, dass sie das Verhalten von Programmen ändern, die von diesem Shell-Skript ausgeführt werden.

Ich werde keine Ihrer anderen Fragen beantworten. Sie sollten immer nur eine Frage stellen. Ich habe nur so viele beantwortet, weil sie vage verwandt sind. Alles andere gehört in eine separate Frage.

Warren Young
quelle