Cosa significa export PATH = qualcosa: $ PATH significa?


27

Sono molto nuovo di Linux e ho messo il seguente comando alla fine del file .profilenella mia cartella home:

export PATH="~/.composer/vendor/bin:$PATH"

Conosco i problemi delle variabili di ambiente e i loro valori un po 'da Windows, ma in questo caso voglio capire cosa fa questo comando e quali sono le parti che comprende:

  1. Cos'è questa frase "export" all'inizio? Esporta i dati per essere disponibili per Bash?

  2. Qual è il primo PATHe qual è il secondo $PATH, e perché ne abbiamo bisogno di due?


Alcune differenze tecniche tra i sistemi operativi a parte, equivale a questo processo su Windows: windowsitpro.com/systems-management/…
Two-Bit Alchemist

1
"export" rende visibile la modifica ai nuovi programmi lanciati da bash.
Thorbjørn Ravn Andersen,

1
@ ThorbjørnRavnAndersen: no, ciò accade se si utilizza o meno il exportcomando, poiché la PATHvariabile è già contrassegnata come esportata. (Provalo in entrambi i modi se non mi credi!)
David

Risposte:


39

Cos'è questa frase "export" all'inizio?

exportè un comando (più precisamente è un built-in di Bash , cioè non è un presente eseguibile PATH, è un comando che Bash ha incorporato in sé).

Esporta i dati per essere disponibili per Bash?

exportimposta la variabile d'ambiente sul lato sinistro dell'assegnazione sul valore sul lato destro dell'assegnazione; tale variabile d'ambiente è visibile al processo che la imposta e a tutti i sottoprocessi generati nello stesso ambiente, cioè in questo caso all'istanza di Bash che genera ~/.profilee a tutti i sottoprocessi generati nello stesso ambiente (che può includere ad esempio anche altre shell , che a sua volta sarà in grado di accedervi).

Qual è il primo PATHe qual è il secondo $PATH, e perché ne abbiamo bisogno di due?

Il primo PATHcome spiegato sopra è la variabile d'ambiente da impostare usando export.

Dato che PATHnormalmente contiene qualcosa quando ~/.profileè di provenienza (per impostazione predefinita contiene /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games), semplicemente impostando PATHsu ~/.composer/vendor/binfarebbe PATHcontenere solo ~/.composer/vendor/bin.

Quindi, poiché i riferimenti a una variabile in un comando vengono sostituiti con (o "espansi" in) il valore della variabile da Bash al momento della valutazione del comando , :$PATHviene messo alla fine del valore da assegnare in PATHmodo che PATHfinisca per contenere ~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games( cioè ciò che PATHcontiene già più ~/.composer/vendor/bin:all'inizio).


Spiegazione formidabile.
Choylton B. Higginbottom,

16

https://help.ubuntu.com/community/EnvironmentVariables probabilmente ti aiuterà. Inoltre man bashpuò essere molto utile per capire come funziona (almeno in Bash)

Ad ogni modo, per quanto riguarda PATH=sostanzialmente l'impostazione della PATHvariabile, l'aggiunta di alcuni nuovi percorsi da cercare, l'aggiunta alla fine di percorsi già / precedentemente impostati, con $PATH(che è fondamentalmente un riferimento alla PATHvariabile).

Quindi, supponiamo che tu sia PATHstato finora impostato su qualcosa del genere:

PATH="x:y:z"

e poi hai impostato

PATH="a:b:c:$PATH"

il tuo PATHdopo sarà come:

a:b:c:x:y:z

Spero che abbia un senso.

Inoltre, esporti la nuova variabile in modo che sia nota nel tuo ambiente, inclusi anche processi secondari / shell secondarie.

Basta essere consapevoli anche che l'ordine delle directory come impostato PATHpuò essere importante. E qualcosa del genere PATH="$PATH:a:b:c"ti darà il risultato:

x:y:z:a:b:c

che influenzerà l'ordine delle directory / percorsi durante la ricerca di un comando (se hai il tuo comando in più di una delle directory, verrà usato il primo trovato - che a volte può darti alcuni risultati imprevisti).


2

Ecco il comando in modo che tutti possano seguire mentre attraversano i punti elenco. export PATH="~/.composer/vendor/bin:$PATH"

  • exportIl /bin/exportcomando shell incorporato (che significa che non c'è , è una cosa shell) fondamentalmente rende le variabili d'ambiente disponibili per altri programmi chiamati da bash(vedere la domanda collegata in Lettura extra) e le subshell.
  • L'assegnazione nella shell avrà prima l'espansione, quindi l'assegnazione avrà luogo per seconda. Quindi, ciò che è racchiuso tra virgolette doppie viene espanso per primo, salvato in PATHvariabile in seguito.
  • $PATHè l' PATHassegnazione predefinita (o almeno l'aspetto della variabile fino a quando questo comando appare nel tuo .bashrco .profile), ed espanderla.
  • ~/.composer/vendor/binsi espanderà fino a /home/username/.composer/vendor/bindove si .composertrova la cartella nascosta a causa del punto iniziale.
  • Quel corto si ~/.composer/vendor/bin:$PATHè ora trasformato in un lungo elenco di cartelle, separate da :. Tutto è racchiuso tra virgolette doppie in modo da includere cartelle con spazi nel loro percorso.
  • Finalmente tutto viene archiviato in PATHcomandi variabili ed esterni autorizzati ad usarlo

Esempio semplice

La mia shell interattiva è in realtà mksh, che sembra avere anche exportincorporato. Usando exportto set VAR, la mia variabile può essere passata e utilizzata dalla successiva catena di comandi / sottoprocessi, dove ho esportato quella stessa variabile

$ echo $SHELL            
/bin/mksh
$ VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR' 
$ export VAR="HelloAskUbuntu"                                                  
$ bash -c 'echo $VAR'                                                          
HelloAskUbuntu
$ 

Lettura extra


3
No, l' ~in ~/.composer/vendor/bin, non sarà ampliato! La tilde si espande solo in alcuni luoghi speciali, come direttamente dopo il =segno. PATH="~/.foo:$PATH"risultati in ~/.foo:/other/path/dirs.... Ma ~sarebbe ampliato PATH=~"/.foo:$PATH", il che si traduce in /home/user/.foo:/other/path/dirs....
Volker Siegel,

2

Ho letto qui e in altri luoghi del web, ne ho parlato con un amico e ho deciso che come matricola (forse più di una matricola di Ubuntu che alcuni qui potrebbero pensare), dovrei mappare questo comando - dovrei fare una mappa e quindi impara che cosa è e dove si trova:

Dati preliminari

Se per ora non hai capito qualcosa in questo capitolo - non ti preoccupare, diventerà più chiaro man mano che continuerai a leggere, ma per capire questa questione devi leggere le variabili di ambiente (EV), i loro valori e lo scopo . Ora cercherò di spiegare il comando in parole semplici e in un metodo di mappatura, per i nuovi arrivati ​​come me e solo per i nuovi arrivati. Ho provato a fare del mio meglio qui ...

Mappatura

export PATH="~/.composer/vendor/bin:$PATH"

Il valore originale dell'EV "PATH" come viene fornito con Ubuntu 15.10, è:

/usr/bin:/usr/sbin

Nella stessa nota di comando abbiamo due frasi PATH. L'ultimo è $ PATH - Il $ dice "stampa il valore oi valori originali dell'EV accanto a te"; L'EV accanto è il PATH EV.

Abbiamo esportato la variabile path stessa (rendendola disponibile anche per i processi secondari, i processi IE eseguiti nella CLI che non sono in realtà la shell Bash, ma eseguiti al suo interno (come Drush , che è la CLI Drupal ).

Oltre all'esportazione, lo abbiamo anche espanso: la prima frase PATH (PATH =) ci ha usato per aggiungere un valore extra (~ / .composer / vendor / bin :) al valore originale (rappresentato da $ PATH).

  • I due punti (:) alla fine del nuovo valore che ho citato nel paragrafo precedente, usano per distinguere il nuovo valore da quello originale.

  • I "" sono i settori in cui risiedono i valori.

  • ~ È la cartella principale.


Spero che dopo questa mappatura l'ho fatto, il comando sarà più chiaro per le matricole come me.


1

Il exportcomando rende disponibili le variabili nei subshells. Cioè, senza di essa, la variabile PATHnon sarebbe visibile nei sottotitoli.

PATH è menzionato due volte:

  • Come variabile viene assegnato il valore, a sinistra del =segno.
  • Come nome variabile viene sostituito dal suo valore a destra del =segno. Ciò rende il vecchio valore parte del nuovo valore.

1
"Cioè, senza di essa, la variabile PATHnon sarebbe visibile nei sottotitoli." Questo non è corretto; PATHè una variabile di ambiente (che non è esattamente la stessa cosa di una variabile di shell ), quindi viene esportata automaticamente e il exportcomando non è necessario.
David

La famiglia di shell Bourne non distingue realmente tra shell e variabili di ambiente. ( sc.tamu.edu/help/general/unix/vars.html ) Sul mio sistema (Arch Linux), bash non conosce nemmeno il setenvcomando.
rexkogitans,

1
C'è ancora una differenza tra le variabili di ambiente di cui il kernel è a conoscenza e le variabili di shell che sono interne a bash. Poiché PATHproviene dall'ambiente, viene esportato automaticamente, quindi non è necessario eseguire exportper propagare le modifiche ai processi figlio (contrariamente a quanto dice la pagina che hai collegato).
David,

Le variabili di ambiente non sono una proprietà del kernel, ma del processo. Dato che il processo di cui stiamo parlando qui è sh, bash (Ubuntu usa zsh?), Penso che possiamo lasciarli uguali alle variabili della shell. Ma, naturalmente, le variabili di shell non vengono passate a nessun programma casuale come le variabili di ambiente.
rexkogitans,

Penso che ci stiamo impantanando in semantica a questo punto. Tutto quello che stavo cercando di dire è che in bash, PATH=fooe export PATH=foohanno un comportamento identico.
David

0
export PATH="~/.composer/vendor/bin:$PATH"
  1. il exportè un comando buildin di bash, mezzi esportare le variabili ad essere variabile envirement. (potresti digitare help exportper inclinarti di più

    (i caratteri seguono il comando sono parammetri, divisi per spazio, quindi in questo caso esiste un solo parametro)

  2. il PATHè il nome della variabile, di solito, varibale predefiniti da bash, essere chiamato in maiuscolo.

  3. i =mezzi assegnano valore a questa variabile.

  4. tutta la stringa è il valore della varibale

  5. il $PATHè una sorta di funciton di bash, di nome variable expantion, bash sostituirà il valore del esistono PATHnella stringa di parametri, prima di inviare la stringa di exportcomando

  6. il :carattere spcial in variabile PATH e compreso da tutte le applicazioni che vogliono usare questa variabile. significa separatore. quindi avranno molte directory nella variabile PATH.

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.