Come configurare smartphone e PC. Portale informativo
  • Casa
  • finestre10
  • Variabile d'ambiente PATH. Variabile di ambiente PATH Variabile di percorso in Linux

Variabile d'ambiente PATH. Variabile di ambiente PATH Variabile di percorso in Linux

Quando inserisci un comando al prompt dei comandi, stai sostanzialmente dicendo alla shell di eseguire un file eseguibile con il nome specificato. Su Linux, questi programmi eseguibili come ls, find, file e altri tendono a vivere in diverse directory del tuo sistema. Qualsiasi file con autorizzazioni eseguibili archiviato in queste directory può essere eseguito da qualsiasi luogo. Le directory più comuni che contengono programmi eseguibili sono /bin, /sbin, /usr/sbin, /usr/local/bin e /usr/local/sbin.

Ma come fa la shell a sapere in quali directory cercare i programmi eseguibili o esegue la ricerca nell'intero file system?

La risposta è semplice. Quando esegui un comando, la shell cerca in tutte le directory specificate nella variabile $PATH dell'utente un file eseguibile con quel nome.

Questo articolo mostra come aggiungere directory alla variabile $PATH di sistema.

Cos'è $PATH in Linux

La variabile d'ambiente $PATH è un elenco di directory colonizzato da due punti che indica alla shell quali directory cercare i file eseguibili.

Per verificare quali directory hai nella variabile $PATH, puoi utilizzare il comando printenv o echo:

Echo $PATH

L'output sarà simile al seguente:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Se sono presenti due file eseguibili con lo stesso nome posizionati in due directory diverse, la shell eseguirà il file che si trova nella directory che viene prima in $PATH.

Aggiunta di una directory al tuo $PATH

Ci sono situazioni in cui potresti voler aggiungere altre directory alla tua variabile $PATH. Ad esempio, alcuni programmi potrebbero essere installati in posizioni diverse oppure potresti voler avere una directory dedicata per le tue voci personali ma essere in grado di eseguirle senza specificare il percorso assoluto degli eseguibili. Per fare ciò, devi solo aggiungere la directory al tuo $PATH.

Supponiamo che tu abbia una directory chiamata bin situata nella tua directory home in cui memorizzi gli script della shell. Per aggiungere una directory alla variabile $PATH:

Il comando export esporta la variabile modificata negli ambienti figli dei processi della shell.

Ora puoi eseguire i tuoi script semplicemente digitando il nome dello script eseguibile senza specificare il percorso completo del file eseguibile.

Tuttavia, questa modifica è temporanea e influisce solo sulla sessione di shell corrente.

Per rendere permanente la modifica, è necessario definire una variabile $PATH nei file di configurazione della shell. Sulla maggior parte delle distribuzioni Linux, quando si avvia una nuova sessione, le variabili di ambiente vengono lette dai seguenti file:

  • File di configurazione globale della shell come /etc/environment e /etc/profile. Utilizzare questo file se si desidera che una nuova directory venga aggiunta al $PATH di tutti gli utenti del sistema.
  • File di configurazione per shell utente individuali. Ad esempio, se stai usando Bash, puoi impostare la variabile $PATH nel file ~/.bashrc e se stai usando Zsh, il nome del file è ~/.zshrc.

In questo esempio, imposteremo una variabile nel file ~/.bashrc. Apri il file in un editor di testo e aggiungi la seguente riga alla fine:

Nano ~/.bashrc

Esporta PATH="$HOME/bin:$PATH"

Salvare il file e caricare il nuovo valore $PATH nella sessione di shell corrente utilizzando:

Fonte ~/.bashrc

Per confermare che la directory è stata aggiunta correttamente, stampa il suo valore $PATH digitando:

Echo $PATH

Conclusione

Aggiungere nuove directory al tuo utente o $PATH globale è abbastanza semplice. Ciò consente di eseguire comandi e script archiviati in posizioni non standard senza dover immettere il percorso completo dell'eseguibile.

Le stesse istruzioni si applicano a qualsiasi distribuzione Linux, inclusi CentOS, RHEL, Debian e Linux Mint.

Sentiti libero di lasciare un commento se hai domande.

Che cos'è? Molti dei comandi immessi al prompt dei comandi richiedono l'uso di un programma esterno caricato dal file system. Ad esempio, comandi come mkdir e wc si trovano effettivamente nella cartella /bin.

Quando si immette un'istruzione che la shell Bash non riconosce, tenta di eseguirla come programma e restituisce un errore se non trova un programma con quel nome. E questo vale non solo per i comandi di base che abbiamo visto, perché dalla riga di comando puoi eseguire qualsiasi programma.


Ma come fa Linux, se presente nel file system, a sapere quali programmi eseguire e da quali directory? Il sistema operativo utilizza una variabile di ambiente di sistema per specificare un sottoinsieme di cartelle in cui cercare quando si riceve un comando sconosciuto. Questa variabile si chiama PATH e può essere visualizzata con il seguente comando echo (è richiesto il simbolo $):

Echo $PATH

L'output di questo comando sarà simile ai seguenti sette percorsi assoluti di cartelle, separati da due punti:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Ogni volta che inserisci un comando sconosciuto, Linux esaminerà ciascuna delle cartelle specificate nella variabile d'ambiente nell'ordine in cui sono state specificate, cercando di trovare un programma con lo stesso nome. Se il programma viene trovato, viene eseguito; in caso contrario viene visualizzato un messaggio di errore. Ma non sarà un errore se comprerai come regalo i tuoi amati anelli d’argento. L'argento decorerà ogni donna!

Queste sette cartelle forniscono un facile accesso a tutti i principali programmi del sistema operativo, inclusi . Tutti i programmi al di fuori di queste sette cartelle non possono essere avviati semplicemente digitandone il nome nella riga di comando.

Ad esempio, hai scaricato l'utilità del diario da Internet nella tua cartella Inizio. Se inserisci il suo nome al prompt dei comandi, riceverai un messaggio di errore perché si trova in una cartella non inclusa nel percorso di sistema. Per eseguire questo programma, inserisci la seguente riga (ricorda, il simbolo ~ è una scorciatoia per la tua cartella home):

Se lo hai salvato in una cartella esterna al percorso specificato, dovrai inserire il percorso assoluto e il nome del file per eseguire l'utilità.

Naturalmente, si presuppone che diary sia un semplice programma autonomo che non richiede installazione, poiché la maggior parte delle principali applicazioni inserirà il file eseguibile del programma da qualche parte nel percorso specificato durante il processo di installazione. Così Variabile d'ambiente PATH, divertiti per la tua salute!

Mi chiedo dove aggiungere il nuovo percorso alla variabile d'ambiente PATH. So che questo può essere ottenuto modificando .bashrc (ad esempio), ma non è chiaro come farlo.

Così:

Esporta PATH=~/opt/bin:$PATH

Esporta PATH=$PATH:~/opt/bin

11 risposte

Materiale semplice

PERCORSO=$PERCORSO:~/opz/bin PERCORSO=~/opz/bin:$PERCORSO

a seconda che si voglia aggiungere ~/opt/bin alla fine (per cercare in tutte le altre directory se c'è un programma con lo stesso nome in più di una directory) o all'inizio (per cercare prima in tutte le altre directory).

Puoi aggiungere più voci contemporaneamente. PATH=$PATH:~/opt/bin:~/opt/node/bin o le modifiche all'ordine vanno bene.

Non è necessario esportare se la variabile è già nell'ambiente: qualsiasi modifica al valore della variabile si riflette nell'ambiente.¹ PATH è praticamente sempre nell'ambiente; tutti i sistemi UNIX lo installano molto presto (di solito nel primissimo processo, in effetti).

Se il tuo PERCORSO è creato da molti componenti diversi, potresti ritrovarti con voci duplicate. Vedi Come aggiungere un percorso alla tua directory home che verrà rilevato da Unix, quale comando? e Rimuovi le voci $PATH duplicate utilizzando il comando awk per evitare duplicati o rimuoverli.

Dove mettere

Tieni presente che ~/.bash_rc non è leggibile da nessun programma e ~/.bashrc è il file di configurazione per le istanze bash interattive. Non dovresti definire variabili di ambiente in ~/.bashrc . Il posto corretto per definire le variabili d'ambiente come PATH è ~/.profile (o ~/.bash_profile se non ti piacciono le shell diverse da bash). Vedi Qual è la differenza tra loro e quale dovrei usare?

Note sulle shell non bash

In bash, ksh e zsh, export è una sintassi speciale ed entrambi PATH=~/opt/bin:$PATH ed export PATH=~/opt/bin:$PATH fanno anche la cosa giusta. Su altre shell Bourne/POSIX, come dash (che è /bin/sh su molti sistemi), l'export viene analizzato come un normale comando, il che implica due differenze:

  • ~ viene analizzato solo all'inizio di una parola, tranne che negli assegnamenti (vedi Come si aggiunge un percorso di directory home che verrà rilevato da Unix che richiede il comando? ;
  • $PATH le virgolette esterne si interrompono se PATH contiene spazi o \[*? .

Quindi, in shell come dash, export PATH=~/opt/bin:$PATH imposta PATH sulla stringa letterale ~/opt/bin/: seguita dal valore PATH fino al primo posto.

PATH=~/opt/bin:$PATH (assegnazione semplice) non richiede virgolette e fa tutto bene. Se vuoi usare export in uno script portabile, devi scrivere export PATH="$HOME/opt/bin:$PATH" o PATH=~/opt/bin:$PATH export PATH (o PATH=$HOME/opt /bin: $PATH export PATH per la portabilità anche sulla Bourne shell, che non accetta export var=value e non esegue l'espansione della tilde).

¹ Questo non era vero nelle Bourne shell (come nell'attuale Bourne shell, non nelle moderne shell in stile POSIX), ma al giorno d'oggi è improbabile che si incontrino shell così vecchie. Sotto>

In particolare, è pericoloso dal punto di vista della sicurezza aggiungere percorsi in primo piano, perché se qualcuno può ottenere l'accesso in scrittura al tuo ~/opt/bin , potrebbe inserire un altro ls ad esempio, che probabilmente utilizzerai invece /bin/ls senza accorgersene. Ora immagina lo stesso per ssh o per il tuo browser o scelta... (La stessa cosa tre volte metti sul tuo percorso.)

Sono confuso riguardo alla domanda 2 (poiché è stata rimossa dalla domanda perché era correlata a un problema non correlato):

Qual è un modo efficace per aggiungere ulteriori percorsi a linee diverse?

Inizialmente pensavo che questo potesse fare al caso mio:

Esporta PATH=$PATH:~/opt/bin esporta PATH=$PATH:~/opt/nodo/bin

Ma questo non è dovuto al fatto che la seconda assegnazione non solo aggiunge ~/opt/node/bin ma anche il PATH precedentemente assegnato.

Questa è una possibile soluzione alternativa:

Esporta PATH=$PATH:~/opt/bin:~/opt/nodo/bin

Ma per motivi di leggibilità preferirei avere una destinazione per percorso.

Se dici

PERCORSO=~/opz/bin Questo Tutto

, che sarà nel tuo PATH. PATH è solo una variabile d'ambiente e se vuoi aggiungere a PATH, devi ricostruire la variabile con esattamente il contenuto che desideri. Cioè, quello che dai come esempio nella domanda 2 è esattamente quello che vuoi fare, a meno che non abbia completamente mancato il punto della domanda.

Utilizzo entrambi i moduli nel mio codice. Ho un profilo generale che installo su ogni macchina su cui lavoro che assomiglia a questo, per ospitare directory potenzialmente mancanti:

Esporta PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # aggiunge elementi opzionali al percorso per bindir in $HOME/locale/bin $HOME/bin; do if [ -d $bindir ]; quindi PATH=$PATH:$(bindir) fi fatto

Linux definisce il percorso di ricerca dell'eseguibile con la variabile d'ambiente $PATH. Per aggiungere la directory /data/myscripts all'inizio della variabile di ambiente $PATH, utilizzare quanto segue:

PERCORSO=/dati/mieiscript:$PERCORSO

Per aggiungere questa directory alla fine del percorso, utilizzare il seguente comando:

PERCORSO=$PERCORSO:/dati/mieiscript

  • Ma le precedenti non bastano perché quando si imposta una variabile d'ambiente all'interno di uno script, quella modifica ha effetto solo all'interno dello script. Questa limitazione è limitata in due modi:
  • Se il programma che chiama lo script lo fa includendo invece di chiamando, qualsiasi modifica all'ambiente apportata allo script avrà effetto sul programma chiamante. Questa inclusione può essere eseguita utilizzando il comando punto o il comando source.

$HOME/myscript.sh sorgente $HOME/myscript.sh

L'inclusione include fondamentalmente lo script "chiamabile" nello script "chiamata". Questo è simile a #include in C. Quindi è efficace all'interno di uno script o di un programma chiamante. Ma ovviamente questo non ha effetto per eventuali programmi o script richiamati dal programma chiamante. Per renderlo efficace fino alla catena di chiamate, è necessario seguire l'impostazione della variabile di ambiente utilizzando il comando export.

Ad esempio, il programma shell bash include il contenuto del file .bash_profile per inclusione. Quindi inserisci le seguenti 2 righe in .bash_profile:

PATH=$PATH:/data/myscripts PATH di esportazione

inserisce effettivamente quelle 2 righe di codice in un programma bash. Quindi in bash, la variabile $PATH include $HOME/myscript.sh e, a causa dell'istruzione export, tutti i programmi chiamati da bash hanno la variabile $PATH modificata. E poiché tutti i programmi avviati dal prompt di bash vengono richiamati da bash, il nuovo percorso si applica a tutto ciò che viene avviato dal prompt di bash.

La conclusione è che per aggiungere una nuova directory al percorso, è necessario aggiungere o accodare la directory alla variabile di ambiente $PATH in uno script incluso nella shell ed è necessario esportare la variabile di ambiente $PATH.

Ho con me da tempo due funzioni pathadd e pathrm che aiutano ad aggiungere elementi ad un percorso senza preoccuparmi di duplicazioni.

pathadd accetta un argomento path e un argomento after opzionale, che se aggiunto verrà aggiunto a PATH , altrimenti lo aggiungerà.

In ogni situazione, se aggiungi un percorso, probabilmente vorrai sovrascrivere ciò che è già presente nel percorso, quindi preferisco aggiungerlo per impostazione predefinita.

Pathadd() ( nuovoelemento=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$nuovoelemento($|:)" ; then if [ " $2" = "dopo" ] ; then PATH="$PATH:$nuovo elemento" else PATH="$nuovo elemento:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;G")" )

Inseriscili in qualunque script desideri modificare l'ambiente PATH e ora hai finito.

Pathadd "/foo/bar" pathadd "/baz/bat" dopo il PERCORSO di esportazione

Hai la garanzia di non aggiungere un percorso se già esiste. Se vuoi che /baz/bat venga eseguito per primo.

Pathrm "/baz/bat" pathadd "/baz/bat" PATH di esportazione

Qualsiasi percorso ora può essere spostato in primo piano se è già su un percorso senza raddoppiare.

Metodo di aggiunta/pre-preparazione antiproiettile

Ci sono molte considerazioni coinvolte nella scelta di aggiungere e aggiungere. Molti di essi sono trattati in altre risposte, quindi non li ripeterò qui.

Il punto importante è che anche se gli script di sistema non lo usano (mi chiedo perché) *1, è un modo a prova di bomba per aggiungere un percorso (ad esempio $HOME/bin) alla variabile d'ambiente PATH

PERCORSO="$(PERCORSO:+$(PERCORSO):)$HOME/bin"

da aggiungere (invece di PATH="$PATH:$HOME/bin") e

PERCORSO="$HOME/bin$(PERCORSO:+:$(PERCORSO))"

da aggiungere (invece di PATH="$HOME/bin:$PATH")

Ciò evita falsi due punti iniziali/finali quando $PATH è inizialmente vuoto, il che può avere effetti collaterali indesiderati e può essere un incubo da trovare (questa risposta affronta brevemente il caso awk -way).

$(parametro:+parola)

Se il parametro è nullo o non impostato, non viene sostituito nulla, altrimenti viene sostituita la parola.

Quindi $(PATH:+$(PATH):) si espande in: 1) nulla se PATH è nullo o non impostato, 2) $(PATH): se PATH è impostato.

Nota. Questo è per Bash.

*1 Ho appena scoperto che script come devtoolset-6/enable usano questo, $ cat /opt/rh/devtoolset-6/enable # Variabili di ambiente generali export PATH=/opt/rh/devtoolset-6/root/usr /bin $(PERCORSO:+:$(PERCORSO)) ...

Non posso parlare a nome delle altre distribuzioni, ma Ubuntu ha un file, /etc/environment, che è il percorso di ricerca predefinito per tutti gli utenti. Poiché il mio computer è utilizzato solo da me, inserisco lì tutte le directory che desidero nel mio percorso, a meno che non si tratti di un'aggiunta temporanea che inserisco nello script.

Per me (su Mac OS X 10.9.5) aggiungere il nome del percorso (ad esempio /mypathname) al file /etc/paths ha funzionato molto bene.

Prima della modifica, viene restituito echo $PATH:

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

Dopo aver modificato /etc/paths e riavviato la shell, la variabile $PATH viene aggiunta con /pathname . Infatti, echo $PATH restituisce:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/miopercorso

Quello che è successo è che /mypathname è stato aggiunto alla variabile $PATH.

Variabili d'ambiente ( variabile d'ambiente) vengono utilizzati per memorizzare valori di variabili comuni in diversi script e programmi. Tali variabili possono essere impostate per un tempo, ad esempio, per il periodo di funzionamento di una specifica shell del terminale, o per il periodo di una sessione utente, oppure è possibile impostare una variabile di ambiente a livello globale - per l'intero sistema.

Variabili d'ambiente

$CASA
La variabile contiene il percorso della directory home dell'utente corrente. $UTENTE
Nome utente corrente $PATH
Elenco di directory in cui la shell cerca i programmi eseguibili. $PWD
Percorso della directory di lavoro corrente (o pwd). Esempio: dir_path=$(pwd) . $GUSCIO
Interprete predefinito $RANDOM
Genera un numero casuale 0..32767 ogni volta che si accede a una variabile. $SECONDI
Tempo in sec. dal momento in cui avvii la shell dei comandi. $? Il risultato del comando precedente. $NOMEHOST
Nome del computer $HISTFILE
Percorso del file di cronologia dell'interprete $IFS
Elenco dei caratteri separatori dei comandi, parametri, elementi dell'array (predefinito: spazio, tabulazione, nuova riga) $PS1
Modello di stringa del prompt dell'interprete.

Impostazione temporanea di una variabile di ambiente

Impostazione di una variabile di ambiente per il periodo della sessione:

# Per un nuovo processo env nomevar=valore [comando] # Per la shell corrente e tutti i suoi sottoprocessi export nomevar=valore [comando]

Il valore della variabile viene mantenuto fino al riavvio del sistema.

Impostazione di un valore costante

Le variabili di ambiente a livello di sistema vengono impostate tramite il file /etc/environment:

AMBIENTE="dev"

Impostazione di una variabile di ambiente specifica dell'utente tramite ~/.bashrc o ~/.bash_profile:

PERCORSO="$(PERCORSO):/home/utente/bin:"

Attenzione!

Il file ~/.bash_profile verrà eseguito quando l'interprete viene avviato con l'opzione -l. Questo file non può essere letto quando si accede localmente!

È inoltre necessario ricordare che le modifiche avranno effetto solo dopo aver riavviato la sessione!

Visualizzazione del valore di una variabile di ambiente

Per visualizzare il valore di una variabile d'ambiente, c'è il comando printenv:

Printenv<имя_переменной>

#shell, #bash, #ambiente

I migliori articoli sull'argomento