¿Agregar un directorio a $ PATH en CentOS?

84

Acabamos de instalar nuestros nuevos servidores y estamos ejecutando CentOS en todos ellos. Después de instalar con éxito Ruby Enterprise Edition, ahora me gustaría agregar el /usr/lib/ruby-enterprise/bindirectorio REE / bin (ubicado en ) para que sea el intérprete de Ruby predeterminado en el servidor.

He intentado lo siguiente, que solo lo agrega a la sesión de shell actual:

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

¿Cuál sería el enfoque correcto para agregar permanentemente este directorio a $ PATH para todos los usuarios ? Actualmente estoy conectado como root.

¡Gracias por adelantado!

vonconrad
fuente

Respuestas:

116

No es una buena idea editar /etc/profilepara cosas como esta, porque perderá todos sus cambios cada vez que CentOS publique una actualización para este archivo. Esto es exactamente para lo que /etc/profile.dsirve:

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

Inicie sesión de nuevo y disfrute de su RUTA (segura) actualizada:

# 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

En lugar de volver a iniciar sesión, puede volver a cargar el perfil:

# . /etc/profile

Esto actualizará la $PATHvariable.

Miguel
fuente
1
~/.profilees otra opción válida también
Zypher
44
Sí, para un solo usuario. Pero la pregunta era sobre alterar la RUTA para todos los usuarios.
Mike
2
@ Mike ¿Qué es este comando pathmunge?
Nickolai Leschov
@NickolaiLeschov Estoy bastante seguro de que solo agrega un camino a $ PATH.
Mike
@NickolaiLeschov es una función que se define en / etc / profile
CrazyPheel
11

Después de seguir el consejo de fmonk, revisé /etc/bashrc, donde noté que decía "Las cosas del medio ambiente van en / etc / profile". Procedí a mirar /etc/profile, vi esto:

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

Para resolver mi problema, simplemente agregué pathmunge /usr/lib/ruby-enterprise/bindebajo de la declaración if. Esto resolvió mi problema.

vonconrad
fuente
¿Podría alguien explicar qué "$EUID" = "0"significa en este contexto?
Eli
EUID 0 significa que el usuario es root.
bbaja42 05 de
66
Deberías haber usado /etc/profile.d. Vea mi respuesta a continuación.
Mike
Considere aceptar la respuesta @MikeConigliaro como la correcta. Su camino es el correcto. Está desarrollado para funcionar de esa manera. Eche un vistazo a los archivos en la /etc/profile.d/carpeta y lo notará. Además, como dijo, una actualización del sistema podría deshacer su solución.
Caio Cunha
4

"Un shell de inicio de sesión interactivo se inicia después de un inicio de sesión exitoso, utilizando / bin / login, leyendo el archivo / etc / passwd. Esta invocación de shell normalmente lee / etc / profile y su equivalente privado ~ / .bash_profile al inicio.

Un shell interactivo sin inicio de sesión normalmente se inicia en la línea de comandos utilizando un programa de shell (por ejemplo, [prompt] $ / bin / bash) o mediante el comando / bin / su. También se inicia un shell interactivo sin inicio de sesión con un programa de terminal como xterm o konsole desde un entorno gráfico. Este tipo de invocación de shell normalmente copia el entorno principal y luego lee el archivo ~ / .bashrc del usuario para obtener instrucciones adicionales de configuración de inicio. " Http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html

Por lo tanto, no pondría las variables de entorno en bashrc, porque no solo va en contra de una convención común, sino que también extrañará sus variables de bashrc al invocar un terminal desde un entorno gráfico de escritorio.

En Redhat en el /etc/profileencontré este comentario:

"Las funciones y los alias de todo el sistema deben ir en / etc / bashrc. Las variables de entorno personal y los programas de inicio deben ir a ~ / .bash_profile. Las funciones y los alias personales deben ir a ~ / .bashrc".

Entonces, si desea establecer variables de entorno en función del usuario, hágalo en el archivo .bash_profile del usuario.

Dirigiéndome a la .bash_profileleí:

"Variables de entorno personal y programas de inicio.

Los alias y funciones personales deben ir en ~ / .bashrc. Las variables de entorno de todo el sistema y los programas de inicio están en / etc / profile. Los alias y funciones de todo el sistema están en / etc / bashrc ".

Conclusión
Si solo desea que la raíz vea los programas que residen, por ejemplo, en / sbinagregaría esa ruta al .bash_profilearchivo raíz . Pero si desea que cada usuario pueda ver lo que la raíz programas específicos están instalados en su caja me gustaría poner /sbinen /etc/.profile. Ahora cada usuario puede usar la finalización de pestañas para buscar programas específicos de raíz y elevar los derechos si es necesario.

Caso especial: SSH
Cuando se inicia ssh con una línea de comandos, se inicia un shell de inicio de sesión interactivo. Pero en este caso /etc/profileno se lee. Cuando definí variables de entorno en el .bash_profilearchivo de cada usuario, funcionó con ssh.

campos de malla
fuente
2

LO SIENTO interpretó mal la pregunta que la siguiente respuesta es para el perfil de un USUARIO dejándolo en caso de que ayude a alguien

modificar .bash_profile

nano ~/.bash_profile

luego, en algún lugar del archivo, agregue / modifique sus rutas separadas por:

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

luego recarga tu perfil

source ~/.bash_profile

o cierre sesión y vuelva a iniciar sesión

si marca RUTA, debe incluir sus rutas recién agregadas

echo $PATH
GiorgosK
fuente
1

Puede establecer variables de entorno en un archivo .rc; para bash shells (creo que es el más común y predeterminado en CentOS) cada usuario tiene un archivo llamado .bashrc en su directorio de inicio.

Agregue el comando PATH = / usr / lib / ruby-enterprise / bin: $ PATH a este archivo para configurarlo para cualquier usuario en particular.

Para configurarlo para todos los usuarios (como usted menciona), cámbielo en / etc / bashrc (el .bashrc predeterminado en el directorio de inicio de cada usuario debe generar este archivo, pero debe verificarlo dos veces).


fuente