Co to jest PATH w systemie Mac OS?

12

Co to jest PATHw systemie Mac OS? Użyłem go do zainstalowania globalnych narzędzi wiersza polecenia, ale jedyną dokumentacją, którą znalazłem, są tutoriale do tego, jak to zrobić, bez prawdziwego wyjaśnienia tego, co dzieje się pod maską. Nie znalazłem też odpowiedniej strony w Wikipedii .

Więc jaki jest cel PATHi jaka jest różnica między /etc/pathsi ~/.bash_profile**?

Na przykład w moim pathspliku widzę to:

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

Ale w moim ~/.bash_profilewidzę to:

# 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

Czy to tylko dodatek do pathspliku specyficzny dla użytkownika? Co znajduje się wszystko, co w rzeczy paths, jak /usr/bin?

gwg
źródło
2
Nie łącz wielu pytań w jednym poście. Każde twoje pytanie byłoby tu mile widziane osobno, ale nie wszystkie razem tak. Skróć to do jednego pytania, możesz połączyć 1 i 2, ale pozostałe nie mają nic wspólnego ze ŚCIEŻKĄ. 3 odpowiedzi tutaj 4 jest wyjaśnione tutaj i 5 nie ma większego sensu, ja się boję. Twoje pytanie bonusowe również nie pyta, jakie pliki są binarne? Skrypty nie są.
terdon
Zredagowałem swoje pytanie. Również te linki były dla mnie pomocne. Dzięki.
gwg

Odpowiedzi:

15

1. Jaki jest cel ŚCIEŻKI?

PATHjest zmienną środowiskową, która zawiera rozdzieloną dwukropkami listę katalogów, w których powłoka będzie szukać plików wykonywalnych, które nazwiesz w wierszu poleceń, bez podania wyraźnej ścieżki do nich (jak w twoim jsdocprzykładzie). Tak więc, jeśli PATHma

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

wtedy każdy plik wykonywalny, który wywołujesz według nazwy, będzie wyszukiwany w tych katalogach (w tej kolejności), a pierwszy znaleziony plik wykonywalny zostanie wykonany.

2. Jaka jest różnica między / etc / paths a ~ / .bash_profile

Zgodnie z tym pytaniem na ServerFault/etc/paths służy do ustawiania PATHglobalnego (tj. Ogólnosystemowego , dla wszystkich użytkowników), podczas gdy ~/.bash_profilesłuży do ustawiania preferencji dla poszczególnych użytkowników (gdzie ~będzie katalog domowy użytkownika). Co jest napisane w .bash_profilepuszce albo dodać do globalnej PATHz /etc/pathslub zastąpić go całkowicie.

/etc/pathsNawiasem mówiąc , wydaje się , że jest to szczególna cecha systemu Mac OS: przynajmniej nie spotkałem się z tym na GNU / Linux.

Joseph R.
źródło
Właśnie je zredagowałem, ale dziękuję za udzielenie odpowiedzi na wszystkie!
gwg
@ggundersen Uciąłem odpowiedź, aby dopasować do edytowanego pytania.
Joseph R.
@ggundersen możesz także przeczytać moją odpowiedź i zawarte w niej linki /etc/pathsna temat OSX.
terdon
7

Jaki jest cel ŚCIEŻKI?

W ten sposób twoja powłoka znajduje programy. Na lsprzykład podczas pisania uruchamia się program o nazwie, lsktóry działa w /binwiększości systemów, w tym w systemie Mac OS X. Powłoka może to znaleźć tylko dlatego, że /binjest w katalogu PATH.

Powłoka szuka programów w PATHkolejności od lewej do prawej. Jeśli lsw twoim systemie są dwa programy, a ich katalogi znajdują się w twoim PATH, znajdzie ten w katalogu wymienionym jako pierwszy w twoim PATH.

Jaka jest różnica między / etc / paths a ~ / .bash_profile

Ustawione ścieżki /etc/pathssą dodawane do PATHuruchamiania we wszystkich powłokach systemu Mac OS X.

~/.bash_profilejest tylko jednym z kilku skryptów powłoki uruchamianych przez Bash podczas uruchamiania, a kilka z nich jest specyficznych dla Bash. Dlatego jeśli zmienisz powłokę - system Mac OS X również zostanie dostarczony tcshi zsh, na przykład - zmiany wprowadzone, aby /etc/bashrcnie dotyczyły nowej powłoki.

Ponadto /etc/pathsjest plikiem konfiguracyjnym na poziomie systemu, podczas gdy ~/.bash_profilejest na użytkownika. Jeśli masz wielu interaktywnych użytkowników skonfigurowanych na komputerze Mac, nie chcesz dodawać katalogów /etc/paths, w których nie chcesz pojawiać się u wszystkich PATH. To samo dotyczy /etc/bashrc, z wyjątkiem tego, że dotyczy to tylko użytkowników, którzy używają Bash jako powłoki.

Jaka jest różnica między ŚCIEŻKĄ a $ ŚCIEŻKĄ a $ {ŚCIEŻKĄ}?

Zazwyczaj zmienna jest wyświetlana tylko bez pieczęci podczas ustawiania zmiennej. FOO=barustawia FOOzmienną środowiskową na ciąg bar. Jeśli wpiszesz set, powłoka pokaże wszystkie zmienne środowiskowe, w takim przypadku zobaczysz również zmienną bez żadnego znacznika.

$PATHi ${PATH}zwykle są wymienne. Mówią powłoce, aby na miejscu rozszerzyła bieżącą PATHwartość zmiennej. Różnica dotyczy sposobu i miejsca ich użycia. Na przykład:

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

$ echo ${FOO}x
barx

W drugim echopoleceniu powłoka nic nie drukuje, ponieważ prosi powłokę o wydrukowanie zmiennej o nazwie FOOx, która nie istnieje; powłoka traktuje nieistniejące zmienne jako puste. Ponieważ trzeci echoużywa składni nawiasów klamrowych, pozwala powłoce zobaczyć, że żądasz FOOzmiennej, i że xjest to po prostu kolejny znak, który chcesz wydrukować natychmiast po tym.

Nawiasem mówiąc, istnieje inny sposób na uzyskanie tego samego efektu bez nawiasów klamrowych:

$ echo "$FOO"x
barx

Zmienne środowiskowe są rozwijane w podwójnych cudzysłowach, a cudzysłowy oddzielają xod rozszerzania zmiennych, więc powłoka robi właściwą rzecz.

Używam FOOtutaj zmiennej środowiskowej tylko dla przejrzystości. Wszystko, co napisałem powyżej, odnosi się równie dobrze PATH, ponieważ jest to kolejna zmienna środowiskowa. Przykładowe teksty byłyby o wiele dłuższe.

Co oznacza ścieżka eksportu? Kiedy eksportujemy?

Biorąc powyższy FOOprzykład, gdybyś uruchomił inny program, nie zobaczyłby FOOzmiennej, ponieważ nie jest eksportowany. Żyje tylko w tej jednej instancji powłoki:

$ echo $FOO
bar
$ bash
$ echo $FOO

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

Kiedy po raz pierwszy uruchamiam nową bashpowłokę pod tą, której już używałem, a następnie próbuję pokazać wartość FOO, otrzymuję puste, ponieważ FOOnie zostało wyeksportowane do podprogramów, aby zobaczyć. Następnie opuściłem drugie bashwystąpienie, wyeksportowałem je, uruchomiłem bashponownie, a teraz drugie wystąpienie widzi wartość FOO.

Używasz tego, exportgdy chcesz, aby podprogramy widziały wartości ustawione w powłoce, i nie używaj go, jeśli nie chcesz, aby tak się stało.

Zazwyczaj nie eksportuję zmiennych tymczasowych do skryptów powłoki, ponieważ nie chcę, aby zmieniały sposób działania programów z tego skryptu powłoki.

Nie zamierzam odpowiadać na żadne z twoich innych pytań. Powinieneś zadawać tylko jedno pytanie na raz. Odpowiedziałem tylko na tak wiele, ponieważ są niejasno powiązane. Cała reszta należy do osobnego pytania.

Warren Young
źródło