Hva er PATH
i et Mac OS? Jeg har brukt den til å installere globale kommandolinjeverktøy, men den eneste dokumentasjonen jeg har funnet er tutorials for å gjøre nettopp det, uten noen egentlig forklaring på hva som skjer under panseret. Jeg har ikke funnet en relevant side på Wikipedia .
Så hva er hensikten med PATH
og hva er forskjellen mellom /etc/paths
og ~/.bash_profile
**?
For eksempel i min paths
fil, jeg ser denne:
/usr/bin /bin /usr/sbin /sbin /usr/local/bin
Men i min ~/.bash_profile
, Jeg ser dette:
# 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
Er dette bare et brukerspesifikt tillegg til paths
-filen? «er alle de tingene i paths
, som /usr/bin
?
Kommentarer
- Vennligst ikke ‘ Ikke kombiner flere spørsmål i ett innlegg. Hvert av spørsmålene dine vil være velkomne her hver for seg, men ikke alle sammen slik. Vennligst trimm dette ned til et enkelt spørsmål, du kan kombinere 1 og 2, men de andre har ingenting med PATH å gjøre spesifikt. 3 blir besvart her 4 blir forklart her og 5 gir ikke mye mening I ‘ er redd. Heller ikke bonusspørsmålet ditt, hvilke filer er binære? Skript er ikke.
- Jeg har redigert spørsmålet mitt. Også, jeg syntes disse lenkene var nyttige. Takk.
Svar
1. Hva er hensikten med PATH?
PATH
er en miljøvariabel som inneholder en kolon-separert liste over kataloger der skallet ditt vil se etter kjørbare filer du navngir på kommandolinjen uten å oppgi en eksplisitt vei til dem (som i jsdoc
-eksemplet). Dermed, hvis PATH
har
/usr/bin:/bin:/home/bin
, vil alle kjørbare filer du kaller med navn, bli søkt etter i disse katalogene (i den rekkefølgen) og den første kjørbare filen er den som ble utført.
2. Hva er forskjellen mellom / etc / pather og ~ / .bash_profile
I følge dette spørsmålet om ServerFault , /etc/paths
brukes til å angi PATH
globalt (dvs. hele systemet, for alle brukere) mens ~/.bash_profile
brukes til å angi innstillinger per bruker (der ~
vil være brukerens hjemmekatalog). Det som står i .bash_profile
kan enten legge til det globale PATH
fra /etc/paths
eller overstyre det fullstendig.
For posten, /etc/paths
ser ut til å være en MAC OS-særegenhet: Jeg har ikke kommet over den i det minste i GNU / Linux.
Kommentarer
Svar
Hva er hensikten med PATH?
Det er slik din shell finner programmer. Når du for eksempel skriver inn ls
, kjører det et program kalt ls
som bor i /bin
på de fleste systemer, inkludert Mac OS X. Skallet ditt kan bare finne det fordi /bin
er i PATH
.
Skallet søker etter programmer i PATH
rekkefølge, fra venstre til høyre. Hvis det er to ls
programmer på systemet ditt, og katalogene deres er begge i PATH
, vil den finne den i katalogen som er oppført først i PATH
.
Hva er forskjellen mellom / etc / baner og ~ / .bash_profile
Baner satt i /etc/paths
legges til PATH
kl. oppstart i alle skall på Mac OS X.
~/.bash_profile
er bare ett av flere skallskript som kjøres av Bash ved oppstart, og flere av disse er Bash-spesifikke. Derfor, hvis du endrer skallet ditt — Mac OS X sendes også tcsh
og zsh
, for eksempel — endringer som er gjort i /etc/bashrc
gjelder ikke for det nye skallet ditt.
Dessuten er /etc/paths
en konfigurasjonsfil på systemnivå, mens ~/.bash_profile
er per bruker. Hvis du hadde konfigurert flere interaktive brukere på din Mac, ville du ikke legge til kataloger i /etc/paths
at du ikke ønsket å vises i alle «s PATH
. Det samme gjelder /etc/bashrc
, bortsett fra at det selvfølgelig bare gjelder brukere som bruker Bash som skall.
Hva er forskjellen mellom PATH og $ PATH og $ {PATH}?
Du ser vanligvis bare variabel uten sigil når du setter variabelen. FOO=bar
setter FOO
miljøvariabelen til strengen bar
. Hvis du skriver set
, viser skallet deg alle miljøvariablene, og i så fall ser du også variabelen uten noe sigil.
$PATH
og ${PATH}
er vanligvis utskiftbare. De forteller skallet å utvide den nåværende PATH
-variabelen s verdi på stedet. Forskjellen har å gjøre med hvordan og hvor du bruker dem. For eksempel:
$ FOO=bar $ echo $FOO bar $ echo $FOOx $ echo ${FOO}x barx
I den andre echo
-kommandoen skriver ikke skallet ut noe fordi det ber skallet om å skrive ut en variabel kalt FOOx
, som ikke eksisterer; skallet behandler ikke-eksisterende variabler som tomme. Fordi den tredje echo
bruker den krøllete avstivningssyntaks , lar det skallet se at du ber om FOO
-variabelen, og at x
bare er et tegn du vil skrive ut umiddelbart etterpå .
Det er for øvrig en annen måte å få den samme effekten uten krøllete bukseseler:
$ echo "$FOO"x barx
Miljøvariabler utvides i doble anførselstegn, og anførselstegnene skiller x
fra variabel utvidelse slik at skallet gjør det rette.
Jeg bruker m FOO
miljøvariabel her bare for klarhet. Alt jeg har skrevet ovenfor gjelder like godt for , siden det bare er en annen miljøvariabel. Eksempeltekstene ville bare være mye lenger.
Hva betyr eksport PATH? Når eksporterer vi?
Hvis vi tar eksemplet ovenfor FOO
, hvis du skulle kjøre et annet program, vil ikke se FOO
variabelen fordi den ikke eksporteres. Den lever bare innenfor den ene skallforekomsten:
$ echo $FOO bar $ bash $ echo $FOO $ exit $ export FOO $ bash $ echo $FOO bar
Når jeg først kjører et nytt bash
skall under det jeg allerede brukte, så prøv å vise verdien til FOO
, få et blankt fordi FOO
ikke ble eksportert for underprogrammer å se. Så gikk jeg ut av den andre bash
forekomsten, eksporterte den, kjørte bash
igjen, og nå ser den andre forekomsten verdien av FOO
.
Du bruker export
når du vil at underprogrammer skal se verdier satt i skallet, og ikke bruker det når du ikke vil at det skal skje.
Vanligvis eksporterer jeg ikke midlertidige variabler i skallskript, fordi jeg ikke vil at de skal endre hvordan programmene kjører fra det skallskriptet oppfører seg.
Jeg kommer ikke til å svare på noen av de andre spørsmålene dine. Du skal bare stille ett spørsmål om gangen. Jeg har bare svart på dette mange fordi de er uklart relaterte. Alt annet hører hjemme i et eget spørsmål.
/etc/paths
på OSX.