Aggiunta di una directory a $ PATH in CentOS?


84

Abbiamo appena installato i nostri nuovi server e stiamo eseguendo CentOS su tutti. Dopo aver installato con successo Ruby Enterprise Edition, ora vorrei aggiungere la /usr/lib/ruby-enterprise/bindirectory REE / bin (situata in ) per renderla l'interprete Ruby predefinito sul server.

Ho provato quanto segue, che lo aggiunge solo alla sessione di shell corrente:

export PATH=/usr/lib/ruby-enterprise/bin:$PATH

Quale sarebbe l'approccio corretto all'aggiunta permanente di questa directory a $ PATH per tutti gli utenti . Sono attualmente connesso come root.

Grazie in anticipo!

Risposte:


116

Non è una buona idea modificare /etc/profileper cose come questa, perché perderai tutte le modifiche ogni volta che CentOS pubblica un aggiornamento per questo file. Questo è esattamente ciò che /etc/profile.dserve per:

# echo 'pathmunge /usr/lib/ruby-enterprise/bin' > /etc/profile.d/ree.sh
# chmod +x /etc/profile.d/ree.sh

Esegui nuovamente l'accesso e goditi il ​​PERCORSO (sicuro) aggiornato:

# echo $PATH
/usr/lib/ruby-enterprise/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# which ruby
/usr/lib/ruby-enterprise/bin/ruby

Invece di accedere nuovamente, è possibile ricaricare il profilo:

# . /etc/profile

Questo aggiornerà la $PATHvariabile.


1
~/.profileè anche un'altra opzione valida
Zypher,

4
Sì, per un singolo utente. Ma la domanda riguardava la modifica del PERCORSO per tutti gli utenti.
Mike,

2
@Mike Cos'è questo comando pathmunge?
Nickolai Leschov,

@NickolaiLeschov Sono abbastanza sicuro che aggiunge solo un percorso a $ PATH.
Mike,

@NickolaiLeschov è una funzione definita in / etc / profile
CrazyPheel

11

Dopo aver seguito il consiglio di Fmonk, ho verificato /etc/bashrc, dove ho notato che diceva "Le cose dell'ambiente vanno in / etc / profile". Ho continuato a guardare dentro /etc/profile, ho visto questo:

pathmunge () {
    if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
       if [ "$2" = "after" ] ; then
          PATH=$PATH:$1
       else
          PATH=$1:$PATH
       fi
    fi
}

[...]

# Path manipulation
if [ "$EUID" = "0" ]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
fi

Per risolvere il mio problema, ho semplicemente aggiunto pathmunge /usr/lib/ruby-enterprise/binsotto l'istruzione if. Questo ha risolto il mio problema.


Qualcuno potrebbe spiegare cosa "$EUID" = "0"significano in questo contesto?
Eli,

EUID 0 indica che l'utente è root.
bbaja42,

6
Avresti dovuto usare /etc/profile.d. Vedi la mia risposta qui sotto.
Mike,

Considera di accettare la risposta di @MikeConigliaro come corretta. La sua strada è quella corretta. È stato sviluppato per funzionare in questo modo. Dai un'occhiata ai file nella /etc/profile.d/cartella e lo noterai. Inoltre, come ha detto, un aggiornamento del sistema potrebbe annullare la soluzione.
Caio Cunha,

4

"Una shell di login interattiva viene avviata dopo un login riuscito, usando / bin / login, leggendo il file / etc / passwd. Questa chiamata della shell normalmente legge / etc / profile e il suo equivalente privato ~ / .bash_profile all'avvio.

Una shell interattiva non di accesso viene normalmente avviata dalla riga di comando utilizzando un programma shell (ad esempio, [prompt] $ / bin / bash) o dal comando / bin / su. Una shell interattiva non di accesso viene anche avviata con un programma terminale come xterm o konsole da un ambiente grafico. Questo tipo di invocazione della shell normalmente copia l'ambiente genitore e quindi legge il file ~ / .bashrc dell'utente per ulteriori istruzioni sulla configurazione di avvio. " Http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html

Pertanto non metterei le variabili di ambiente in bashrc, perché non è solo contro una convenzione comune, ma mancherete anche le vostre variabili bashrc quando invocate un terminale da un ambiente desktop grafico.

Su Redhat nel /etc/profileho trovato questo commento:

"Gli alias e le funzioni di sistema dovrebbero andare in / etc / bashrc. Le variabili di ambiente personale e i programmi di avvio dovrebbero andare in ~ / .bash_profile. Gli alias e le funzioni personali dovrebbero andare in ~ / .bashrc."

Quindi, se si desidera impostare le variabili di ambiente su base utente, farlo nel file .bash_profile dell'utente.

Dirigendosi verso l' .bash_profileho letto:

"Variabili d'ambiente personali e programmi di avvio.

Gli alias e le funzioni personali dovrebbero andare in ~ / .bashrc. Le variabili di ambiente di sistema e i programmi di avvio sono in / etc / profile. Gli alias e le funzioni di sistema sono in / etc / bashrc. "

Conclusione
Se si desidera che solo root visualizzi i programmi residenti, ad esempio in / sbinVorrei aggiungere quel percorso al .bash_profilefile root . Ma se si vuole ad ogni utente di vedere cosa radice programmi specifici sono installati sulla propria macchina vorrei mettere /sbinin /etc/.profile. Ora ogni utente può utilizzare il completamento della scheda per cercare programmi specifici per root ed elevare i diritti se necessario.

Caso speciale: SSH
Quando ssh viene avviato con una riga di comando, viene avviata una shell di login interattiva. Ma in questo caso /etc/profilenon viene letto. Quando ho definito le variabili di ambiente nel .bash_profilefile di ciascun utente ha funzionato con ssh.


2

SPIACENTE ha interpretato erroneamente la domanda che il seguente suggerimento è per il profilo di un UTENTE lasciandolo nel caso in cui aiuti qualcuno

modifica .bash_profile

nano ~/.bash_profile

quindi da qualche parte nel file aggiungi / modifica i tuoi percorsi separati da:

 PATH=$PATH:$HOME/bin:/your/path
 export PATH

quindi ricaricare il tuo profilo

source ~/.bash_profile

o disconnettersi e accedere nuovamente

se controlli PERCORSO dovrebbe includere i tuoi percorsi appena aggiunti

echo $PATH

1

È possibile impostare le variabili di ambiente in un file .rc; per bash shell (credo il più comune e predefinito in CentOS) ogni utente ha un file chiamato .bashrc nella sua directory home.

Aggiungi il comando PATH = / usr / lib / ruby-enterprise / bin: $ PATH a questo file per impostarlo per un particolare utente.

Per impostarlo per tutti gli utenti (come accennato), modificarlo in / etc / bashrc (il .bashrc predefinito nella directory home di ciascun utente dovrebbe generare questo file, ma è necessario ricontrollarlo).

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.