Entorno de linux

Que es el entorno?

Es un conjunto de informacion que de carga en memorai ram cuando nos autenticamos en el sistema o abrimos una shell.

Que informacion encontramos en el entorno?

Encontramos variables estas variables se definen en dos tipos:

  1. Variables de entorno.
  2. Variables de shell.

Tambien tendremos funciones bash y alias

Los programas que usamos toman informacion ademas de las configuraciones normales de este entorno.

Como ver las variables de entorno definidas?

printenv

PWD=/home/akerman
XDG_BACKEND=wayland
LC_TELEPHONE=es_AR.UTF-8
XCURSOR_PATH=/home/akerman/.icons:/home/akerman/.local/share/icons:/home/akerman/.nix-profile/share/icons:/home/akerman/.nix-profile/share/pixmaps:/nix/profile/share/icons:/nix/profile/share/pixmaps:/home/akerman/.local/state/nix/profile/share/icons:/home/akerman/.local/state/nix/profile/share/pixmaps:/etc/profiles/per-user/akerman/share/icons:/etc/profiles/per-user/akerman/share/pixmaps:/nix/var/nix/profiles/default/share/icons:/nix/var/nix/profiles/default/share/pixmaps:/run/current-system/sw/share/icons:/run/current-system/sw/share/pixmaps
LOCALE_ARCHIVE_2_27=/nix/store/j15nlixvk5f6wviz93vn4lscn1pkiki4-glibc-locales-2.39-52/lib/locale/locale-archive
LC_MONETARY=es_AR.UTF-8
LC_PAPER=es_AR.UTF-8
KITTY_PID=5526

...

Dentro de los resultados podriamos llegar a ver que SHELL usa el usuario logeado por default, el logname,username, PATH.

Por ejemplo cuando hacemos cat fichero.txt el sistema es capaz de ejecutar cat pero cat se encuentra en /usr/bin/cat, podes verlo con type cat, yo no tengo la necesidad de hacer /usr/bin/cat fichero.txt eso es porque esa informacion ya se encuentra en el entorno, mas precisamente en PATH.

Funciones bash

Podemos verlas con set pero sera dificil de leer por lo que te recomiendo que lo hagas con set | less, veremos funciones que son bash script

Podemos ver los alias con alias estos no aparence en printenv

Como imprimir una variable de entorno?

echo $VARIABLE_DESEADA
echo $PATH

Como se establece el entorno?

cómo se han definido estas variables, estas funciones y cómo podríamos nosotros definir nuestras propias variables y modificar las existentes?

Primero tenemos que entender que cuando nos logeamos lo que ocurre es que se van a ejecutar una serie de scripts de arranque que se suelen denominar start up scripts que lo que hacen es componer nuestro entorno. Es decir van a crear y definir toda las variables de entornoque hemos visto que vienen por defecto.

Donde se encuentran estos scripts?

Primero hay que saber que hay dos tipos de scripts.

  1. Scripts que van a afectar a todo el sistema y a todos los usuarios definidos en el sistema. (globales)
  2. Scripts que solo van a afectar sesiones concretas o usuarios concretos.

Comencemos por los scripts que van a definir variables que van a afectar a todo el sistema.

Para eso podemos ver el fichero vim /etc/environment aca se definen variables de
entorno para todo el sistema y todos los usuarios.

La variable por defecto que encontraremos dentro es $PATH. En este fichero no podemos agrgar codigo bash script, sino que aca podemos agrgar asignaciones a variables. Estas no solo afectaran el enterno de la shell sino tambien del escritorio , todo el resto del sistema y usuarios.

Otro fichero muy popular aunque no es apropiado modificarlo es /etc/profile si lo abrimos veremos que tienen codigo bash script Esto no son solo asignaciones como vimos en el fichero de etc/environment lo que hace concretamente es aplicar una serie de configuraciones en la shell de bash.

Si prestamos atencion a la parte superior del fichero veremos que dice #system wide esto quiere decir que afectara a todo el sistema.

Como mensionamos antes, este fichero no hay que tocarlo directamente, para extender funcionalidad tenemos que crear el fichero dentro de /etc/profile.d/ alli guardaremos todos los ficheros.sh que se ejecutaran al iniciar la session.

Esto no siempre se va a ejecutar, sino que va a hacerce cuando tengamos una session con logging.

Es decir, por ejemplo, si yo me estoy autenticado utilizando SSH, que me va a pedir usuario y contraseña, tendré una shell interactiva en la que yo me he tenido que loguear.

En ese caso se va a ejecutar concretamente los scripts que tenemos en profile.

Sin embargo, si yo simplemente abro una terminal. Cuando se ha abierto esa shell no se ejecutan esos scripts porque no se requiere login.

Hasta aca ya conocemos los ficheros:

  1. /etc/profile
  2. /etc/profile.d
  3. /etc/environment

Pero todavia nos queda uno que aplica a todo el sistema y es el fichero /etc/bash.bashrc.

En el se definien variables de entorno que van a estar disponibles para programas que se ejecuten en la shell.

Entonces, las variables que se definen en este fichero no van a estar disponibles para otros programas que se inicien, por ejemplo, desde la interfaz gráfica.

Si yo quisiese definir realmente una variable de entorno que pudiese consumir cualquier programa, debería hacerlo en el fichero /etc/environment.

Si quisiese definirla para una sesión interactiva con login, probablemente tendría que hacerlo en /etc/profile o /etc/profile.d.

Si quiero que al abrir una nueva shell, tener listas las variables de entorno entonces las defino en /etc/bash.bashrc

Ficheros que afectan a un usuario concreto.

El primero de ellos es $HOME/.profile Tal como pasaba con /etc/profile las variables de este entorno estaran disponibles si nos conectamos via ssh o cualquier otro medio que requiera login.

.profile importa dentro de el a .bashrc el cual veremos luego.

Otros ficheros de script son .bash_profile y .bash_login estos dos estaran en el contexto de aplicaciones que ejecutemos desde la terminal mientras que .profile abarcara el contexto tanto de la shell como del entorno grafico.

.bashrc

.bashrc se ejecuta en la shell independientemente de que hagamos login o no. Las app que se ejcuten desde la interfaz grafica no se veran afectadas por el entorno.

.bashrc soporta variables de entorno como funciones bash script

Resumen

Ficheros con aplicación a todo el sistema (todos los usuarios del sistema)

  • /etc/environment

    • Fichero específico para la definición de variables de entorno. No puede contener scripts.
    • Se ejecuta al iniciar el sistema.
  • /etc/profile

    • Permite definir variables de entorno y scripts.
    • No es recomendable modificar este fichero directamente; se deben crear nuevos ficheros en /etc/profile.d.
    • Se ejecuta en shells con login.
  • /etc/profile.d

    • Contiene scripts que se ejecutan en shells con login.
  • /etc/bash.bashrc

    • Permite definir variables de entorno y scripts para programas iniciados desde la shell bash.
    • Las variables definidas aquí no estarán disponibles para programas iniciados desde la interfaz gráfica.
    • No se ejecuta en shells con login.

Ficheros con aplicación a un usuario específico

  • ~/.profile

    • Permite definir variables de entorno y scripts.
    • Se ejecuta al iniciar la sesión de Escritorio o en una shell con login.
    • Las variables afectan a todos los programas ejecutados desde el escritorio gráfico o desde la shell.
  • ~/.bashrc

    • Permite definir variables de entorno y scripts.
    • Se ejecuta cuando se abre una shell sin necesidad de login.
    • Es específico de la shell bash, por lo que las variables definidas solo afectarán a los programas ejecutados desde bash.
  • ~/.bash_profile y ~/.bash_login

    • Permiten definir variables de entorno y scripts.
    • Se ejecutan cuando se utiliza una shell con login.
    • Son específicos de bash, por lo que las variables definidas solo afectarán a los programas ejecutados desde bash.

Modificando el entorno.

Una de las maneras para modificar las varibles de enterno es desde la shell.

Por ejemplo si hacemos echo $HOME veremos algo como /home/tu-user/, en este caso desde la misma shell hacemos HOME=home/tu-user/desktop, ahora al hacer echo $HOME veremos HOME=home/tu-user/desktop.

En el caso de asiganrle un valor a una variable que no exista previamente como EDITOR=vim lo que pasara es que sera una variable de shell , pero no una de entorno. Que significa esto? que la varible de shell no podra ser accedida por ninguna app que no sea la misma shell.

Para convertir una variable de shell a una variable de entorno hacemos lo siguiente:

export EDITOR

Si ahora hacemos un printenv | grep EDITOR podremos ver que nos revuelve la respueta EDITOR=vim

Si usamos los metodos anteriores para definir variables de entorno, al momento de cerrar la shell y volverla a abrir, volveran al estado inicial o desapareceran depende lo que hayamos hecho. Son solo modificaciones temporales.

Las variables que definamos a nivel sistema como /etc/environment tomaran efecto la siguiente vez que nos logeemos. Si lo que definimos es a nivel shell de usuario específico como .bashrc podemos forzar la recarga con source .bashrc

Agregando variables
  • SHELL
    El nombre de la shell por defecto del usuario.

  • HOME
    El nombre de la ruta de tu directorio personal.

  • LANG / LANGUAGE
    Define el conjunto de caracteres y el orden de cotejo de su idioma.

  • PATH
    Una lista separada por dos puntos de los directorios que se buscan cuando introducimos el nombre de un programa ejecutable.

  • PWD
    El directorio de trabajo actual.

  • _
    Una referencia al programa /usr/bin/printenv (prueba a ejecutar el comando $_).

  • USER
    Tu nombre de usuario.