Che cos'è PATH su un Mac OS?


12

Cosa c'è PATHin un Mac OS? L'ho usato per installare strumenti globali da riga di comando, ma l'unica documentazione che ho trovato sono tutorial per farlo, senza una vera spiegazione di ciò che sta accadendo sotto il cofano. Inoltre non ho trovato una pagina pertinente su Wikipedia .

Allora, qual è lo scopo PATHe qual è la differenza tra /etc/pathse ~/.bash_profile**?

Ad esempio, nel mio pathsfile, vedo questo:

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

Ma nel mio ~/.bash_profile, vedo questo:

# 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

È solo un'aggiunta specifica dell'utente al pathsfile? Cosa c'è tutta quella roba in paths, come /usr/bin?


2
Si prega di non combinare più domande in un singolo post. Ognuna delle tue domande sarebbe benvenuta qui separatamente ma non tutte insieme in questo modo. Riduci a una sola domanda, potresti combinare 1 e 2 ma gli altri non hanno nulla a che fare con il PERCORSO. 3 risponde qui 4 viene spiegato qui e 5 non ha molto senso temo. Né la tua domanda bonus, quali file sono binari? Gli script non lo sono.
terdon

Ho modificato la mia domanda. Inoltre, ho trovato utili questi collegamenti. Grazie.
gwg

Risposte:


15

1. Qual è lo scopo di PATH?

PATHè una variabile di ambiente che contiene un elenco separato da due punti di directory in cui la shell cercherà i file eseguibili che si nominano nella riga di comando senza fornire loro un percorso esplicito (come jsdocnell'esempio). Così, se il vostro PATHha

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

quindi qualsiasi eseguibile chiamato per nome verrà cercato in queste directory (in quell'ordine) e il primo eseguibile trovato è quello eseguito.

2. Qual è la differenza tra / etc / percorsi e ~ / .bash_profile

Secondo questa domanda su ServerFault , /etc/pathsviene utilizzato per impostare PATHglobalmente (cioè a livello di sistema, per tutti gli utenti) mentre ~/.bash_profileviene utilizzato per impostare le preferenze per utente (dove ~sarà la home directory dell'utente). Ciò che è scritto nel .bash_profilepossibile aggiungere al globale PATHda /etc/pathso ignorare completamente.

Per la cronaca, /etc/pathssembra essere una peculiarità del sistema operativo MAC: almeno non l'ho trovato su GNU / Linux.


Li ho appena modificati, ma grazie per aver risposto a tutti loro!
gwg

@ggundersen Ho ritagliato la mia risposta per adattarla alla tua domanda modificata.
Joseph R.

@ggundersen potresti anche voler leggere la mia risposta e i relativi collegamenti /etc/pathssu OSX.
terdon

7

Qual è lo scopo di PATH?

È come la tua shell trova i programmi. Quando digiti ls, ad esempio, è in esecuzione un programma chiamato lsche vive /binsulla maggior parte dei sistemi, incluso Mac OS X. La tua shell può trovarlo solo perché /binè in PATH.

La shell cerca i programmi in PATHordine, da sinistra a destra. Se ci sono due lsprogrammi sul tuo sistema e le loro directory sono entrambe nella tua PATH, troverà quella nella directory elencata per prima nella tua PATH.

Qual è la differenza tra / etc / percorsi e ~ / .bash_profile

I percorsi impostati /etc/pathsvengono aggiunti PATHall'avvio in tutte le shell su Mac OS X.

~/.bash_profileè solo uno dei numerosi script di shell eseguiti da Bash all'avvio e molti di questi sono specifici di Bash. Pertanto, se si modifica la shell - viene fornito anche Mac OS X tcshe zsh, ad esempio, le modifiche apportate /etc/bashrcnon si applicano alla nuova shell.

Inoltre, /etc/pathsè un file di configurazione a livello di sistema, mentre ~/.bash_profileè per utente. Se hai installato più utenti interattivi sul tuo Mac, non vorrai aggiungere directory a /etc/pathscui non vuoi apparire in tutti PATH. Lo stesso vale per /etc/bashrc, tranne quello che ovviamente si applica solo agli utenti che usano Bash come shell.

Qual è la differenza tra PATH e $ PATH e $ {PATH}?

Solitamente vedi la variabile senza il sigillo quando stai impostando la variabile. FOO=barimposta la FOOvariabile di ambiente sulla stringa bar. Se digiti set, la shell ti mostra tutte le variabili d'ambiente e in quel caso vedi anche la variabile senza alcun sigillo.

$PATHe di ${PATH}solito sono intercambiabili. Dicono alla shell di espandere sul posto PATHil valore della variabile corrente . La differenza ha a che fare con come e dove li usi. Per esempio:

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

$ echo ${FOO}x
barx

Nel secondo echocomando, la shell non stampa nulla perché chiede alla shell di stampare una variabile chiamata FOOx, che non esiste; la shell tratta le variabili inesistenti come vuote. Poiché il terzo echoutilizza la sintassi del parentesi graffa, consente alla shell di vedere che si sta richiedendo la FOOvariabile e che xè solo un altro carattere che si desidera stampare immediatamente dopo.

A proposito, c'è un altro modo per ottenere lo stesso effetto senza parentesi graffe:

$ echo "$FOO"x
barx

Le variabili di ambiente vengono espanse tra virgolette doppie e le virgolette separano l' xespansione della variabile in modo che la shell faccia la cosa giusta.

Sto usando la FOOvariabile d'ambiente qui solo per chiarezza. Tutto ciò che ho scritto sopra si applica anche a PATH, dal momento che è solo un'altra variabile d'ambiente. I testi di esempio sarebbero solo molto più lunghi.

Cosa significa esportazione PERCORSO? Quando esportiamo?

Prendendo l' FOOesempio sopra , se dovessi eseguire un altro programma, non vedrebbe la FOOvariabile perché non viene esportata. Vive solo all'interno di quell'istanza di shell:

$ echo $FOO
bar
$ bash
$ echo $FOO

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

Quando eseguo per la prima volta una nuova bashshell sotto quella che stavo già utilizzando, quindi provo a mostrare il valore di FOO, ottengo uno spazio vuoto perché FOOnon è stato esportato per i programmi secondari da vedere. Quindi sono uscito dalla seconda bashistanza, l'ho esportato, eseguito di bashnuovo e ora la seconda istanza vede il valore di FOO.

Usi exportquando vuoi che i sottoprogrammi vedano i valori impostati nella shell e non lo usi quando non vuoi che ciò accada.

In genere, non esporto variabili temporanee negli script di shell, perché non voglio che cambino il comportamento dei programmi eseguiti da quello script di shell.

Non risponderò a nessuna delle tue altre domande. Dovresti solo fare una domanda alla volta. Ho risposto solo a molti perché sono vagamente imparentati. Tutto il resto appartiene a una domanda separata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.