Comprender la configuración de shell bash en el inicio

Comprender la configuración de shell bash en el inicio

Durante años, el shell bash [1] ha sido una parte integral de muchas distribuciones de Linux. Al principio, Bash fue elegido como el Shell oficial de GNU porque era bien conocido, bastante estable, y ofreció un conjunto decente de características.

Hoy la situación es algo diferente: Bash todavía está presente en todas partes como un paquete de software, pero ha sido reemplazado por alternativas en la instalación estándar. Estos incluyen, por ejemplo, Debian Almquist Shell (Dash) [2] (para Debian Gnu/Linux) o ZSH [3] (para Grml [5]). En las conocidas distribuciones Ubuntu, Fedora, Arch Linux y Linux Mint, Bash ha seguido siendo el shell estándar.

Es bastante útil comprender el inicio bash y saber cómo configurar esto correctamente. Esto incluye la personalización de su entorno de shell, por ejemplo, establecer la variable de ruta $, ajustar el aspecto del indicador y crear alias. Además, echaremos un vistazo a los dos archivos .bashrc y .Bash_profile que se leen en el inicio. El conocimiento correspondiente se prueba en el examen 1 de la certificación del Instituto Profesional de Linux [4].

Comparación de un lote de inicio de sesión interactivo y lotes no interactivos

En general, un shell tiene dos modos de operación. Puede ejecutarse como un caparazón de inicio de sesión interactivo y como un lote no interactivo. El modo de operación define el inicio de BASH y qué archivos de configuración se leen [7]. El modo de operación se puede diferenciar de la siguiente manera [6]: carcasa de inicio de sesión interactiva, caparazón no login interactivo, carcasa de inicio de sesión no interactiva y caparazón no interactivo (lote) no login.

En pocas palabras, un caparazón interactivo lee y escribe en la terminal de un usuario. Por el contrario, una capa no interactiva no se asocia con un terminal, como al ejecutar un script de shell por lotes. Una carcasa interactiva puede ser inicio de sesión o un caparazón no login.

Shell de inicio de sesión interactivo

Este modo se refiere a iniciar sesión en su computadora en una máquina local utilizando un terminal que varía de TTY1 a TTY4 (depende de su instalación; puede haber más o menos terminales). Además, este modo cubre de forma remota en una computadora, por ejemplo, a través de un shell seguro (SSH) de la siguiente manera:

$ ssh user@remoto-sistema
$ ssh user@remoto-system remoto command

El primer comando se conecta al sistema remoto y abre un shell interactivo solo. En contraste, el segundo comando se conecta al sistema remoto, ejecuta el comando dado en un shell de inicio de sesión no interactivo y termina la conexión SSH. El siguiente ejemplo muestra esto con más detalle:

$ ssh localhost tiempo de actividad
contraseña de usuario@localhost:
11:58:49 Up 23 días, 11:41, 6 usuarios, promedio de carga: 0,10, 0,14, 0,20
ps

Para averiguar si ha iniciado sesión en su computadora utilizando un shell de inicio de sesión, escriba el siguiente comando de eco en su terminal:

$ Echo $ 0
-intento
ps

Para un shell de inicio de sesión, la salida comienza con un "-" seguido del nombre del shell, lo que resulta en "-bash" en nuestro caso. Para un shell no login, la salida es solo el nombre de la carcasa. El siguiente ejemplo muestra esto para los dos comandos Echo $ 0, y el tiempo de actividad se da a SSH como un parámetro de cadena:

$ ssh localhost "echo $ 0; tiempo de actividad"
contraseña de usuario@localhost:
intento
11:58:49 Up 23 días, 11:41, 6 usuarios, promedio de carga: 0,10, 0,14, 0,20
ps

Como alternativa, use el comando Shopt incorporado [8] de la siguiente manera:

$ shopt login_shell
Login_shell Off
ps

Para un shell no login, el comando devuelve "apagado" y para un shell de inicio de sesión, "encendido".

Con respecto a la configuración de este tipo de shell, se tienen en cuenta tres archivos. Estos son/etc/perfil, ~/.Perfil, y ~/.bash_profile. Consulte a continuación una descripción detallada de estos archivos.

Caparazón no login interactivo

Este modo describe la apertura de una nueva terminal, por ejemplo, Xterm o Gnome Terminal, y ejecutando un caparazón en él. En este modo, los dos archivos/etc/bashrc y ~/.Bashrc se leen. Consulte a continuación una descripción detallada de estos archivos.

Caparazón no interactivo

Este modo está en uso al ejecutar un script de shell. El script de shell se ejecuta en su propia subshell. Se clasifica como no interactivo a menos que solicite la entrada del usuario. El shell solo se abre para ejecutar el script y lo cierra inmediatamente una vez que el script ha terminado.

./Script local.mierda

Shell de inicio de sesión no interactivo

Este modo cubre iniciar sesión en una computadora desde un control remoto, por ejemplo, a través de Secure Shell (SSH). El script script local-script.SH se ejecuta localmente, primero, y su salida se usa como entrada de SSH.

./Script local.sh | user ssh@system remoto

Inicio de SSH sin ningún comando adicional inicia un shell de inicio de sesión en el sistema remoto. En caso de que el dispositivo de entrada (STDIN) del SSH no sea terminal, SSH inicia una capa no interactiva e interpreta la salida del script como comandos que se ejecutarán en el sistema remoto. El ejemplo a continuación ejecuta el comando de tiempo de actividad en el sistema remoto:

$ echo "tiempo de actividad" | ssh localhost
Pseudo-terminal no se asignará porque Stdin no es un terminal.
la contraseña de Frank@localhost:
Los programas incluidos con el sistema Debian GNU/Linux son el software gratuito;
Los términos de distribución exactos para cada programa se describen en el
Archivos individuales en/usr/share/doc/*/copyright.
Debian GNU/Linux no tiene absolutamente ninguna garantía, en la medida
Permitido por ley aplicable.
Tienes un nuevo correo.
11:58:49 Up 23 días, 11:41, 6 usuarios, promedio de carga: 0,10, 0,14, 0,20
ps

Curiosamente, SSH se queja de que Stdin no es un terminal y muestra el mensaje del día (MOTD) que se almacena en el archivo de configuración global /etc /MOTD. Para acortar la salida del terminal, agregue la opción "SH" como un parámetro del comando ssh, como se muestra a continuación. El resultado es que se abre primero un shell, y los dos comandos se ejecutan sin mostrar el MOTD, primero.

$ echo "tiempo de actividad" | ssh localhost sh
la contraseña de Frank@localhost:
12:03:39 Up 23 días, 11:46, 6 usuarios, promedio de carga: 0,07, 0,09, 0,16
$$

A continuación, echaremos un vistazo a los diferentes archivos de configuración para BASH.

Archivos de inicio de Bash

Los diferentes modos bash definen qué archivos de configuración se leen en el inicio:

  • Shell de inicio de sesión interactivo
    • /etc/perfil: si existe, ejecuta los comandos enumerados en el archivo.
    • ~/.Bash_profile, ~/.Bash_login, y ~/.Perfil (en ese orden). Ejecuta los comandos desde el primer archivo legible que se encuentra en la lista. Cada usuario individual puede tener su propio conjunto de estos archivos.
  • caparazón no login interactivo
    • /etc/bash.BASHRC: Configuración global de bash. Ejecuta los comandos si ese archivo existe, y es legible. Solo disponible en Debian Gnu/Linux, Ubuntu y Arch Linux.
    • ~/.BASHRC: Configuración de Bash local. Ejecuta los comandos si ese archivo existe, y es legible.

Puede ser útil ver esto como un gráfico. Durante la investigación, encontramos la imagen a continuación, que nos gusta mucho [9].


imagen: Path de configuración.png
texto: Proceso de evaluación para la configuración de BASH

Los diferentes archivos de configuración explicados

Para los archivos explicados a continuación, no hay un conjunto de reglas generales en qué opción almacenar en qué archivo (excepto las opciones globales vs. opciones locales). Además, el orden de los archivos de configuración se lee está diseñado con flexibilidad en mente para que un cambio del shell que use asegura que aún pueda usar su sistema Linux. Es por eso que se usan varios archivos que configura lo mismo.

/etc/perfil

Este archivo es utilizado por Bourne Shell (SH), así como conchas compatibles con Bourne como Bash, Ash y KSH. Contiene las entradas predeterminadas para las variables de entorno para todos los usuarios que inician sesión interactivamente. Por ejemplo, esto influye en la ruta $ y el diseño rápido para los usuarios regulares, así como el usuario llamado "root". El siguiente ejemplo muestra una parte de/etc/perfil de Debian GNU/Linux.

setUserPath ()
# Directorios comunes para ejecutables para todos los usuarios
Ruta = "/usr/local/bin:/usr/bin:/bin"
# Prueba para que el usuario root agregue para los programas de administración del sistema
if ["'id -u'" -eq 0]; entonces
Ruta = "/usr/local/sbin:/usr/sbin:/sbin: $ ruta"
demás
Path = "/usr/local/games:/usr/games: $ path"
FI
ruta de exportación

setUserPath ()
# PS1 es la cadena del símbolo del sistema principal
if ["$ ps1"]; entonces
if ["$ bash"] && ["$ bash" != "/bin/sh"]; entonces
# La fiesta del archivo.BASHRC ya establece la PS1 predeterminada.
# Ps1 = "\ h: \ w \ $"
Si [-f /etc /Bash.bashrc]; entonces
. /etc/bash.bashrc
FI
demás
if ["'id -u'" -eq 0]; entonces
Ps1 = '#'
demás
Ps1 = '$'
FI
FI
FI

Otros archivos de configuración se pueden guardar en el directorio /etc /perfil.d. Se obtienen en la configuración de Bash tan pronto como se lee /etc /el perfil se lee.

~/.bash_profile

Este archivo de configuración local se lee y ejecuta cuando Bash se invoca como un shell de inicio de sesión interactivo. Contiene comandos que deberían ejecutarse solo una vez, como personalizar la variable de entorno de ruta $.

Es bastante común llenar ~/.bash_profile solo con líneas como debajo de esa fuente la .archivo bashrc. Esto significa que cada vez que inicia sesión en el terminal, se lee el contenido de su configuración de bash local.

Si [-f ~/.bashrc]; entonces
. ~/.bashrc
FI

Si el archivo ~/.Bash_profile existe, luego Bash saltará la lectura de ~/.Bash_login (o ~/.perfil).

~/.bash_login

Los dos archivos ~/.Bash_profile y ~/.bash_login son análogos.

~/.perfil

La mayoría de las distribuciones de Linux están utilizando este archivo en lugar de ~/.bash_profile. Se usa para localizar el archivo local .bashrc y extender la variable de ruta $.

# Si ejecuta Bash
if [-n "$ bash_version"]; entonces
# incluir .bashrc si existe
if [-f "$ home/.bashrc "]; entonces
. "$ Home/.bashrc "
FI
FI
# Establezca ruta para que incluya el contenedor privado del usuario si existe
if [-d "$ home/bin"]; entonces
Ruta = "$ home/bin: $ ruta"
FI

En general, ~/.El perfil es leído por todos los proyectiles. Si o ~/.bash_profile o ~/.Bash_login existe, Bash no leerá este archivo.

/etc/bash.bashrc y ~/.bashrc

Este archivo contiene la configuración de Bash y maneja los alias locales, los límites del historial almacenados en .bash_history (ver más abajo) y completar bash.

# No pongas líneas o líneas duplicadas que comienzan con el espacio en la historia.
# Ver bash (1) para obtener más opciones
Histontrol = ignoreboth
# Agregar al archivo del historial, no lo sobrescribirá
Shopt -S Histappend
# Para establecer la longitud del historial, ver Histsize e HistFilesize in Bash (1)
Histsize = 1000
Histfilesize = 2000

Qué configurar en qué archivo

Como ha aprendido hasta ahora, no hay un solo archivo sino un grupo de archivos para configurar Bash. Estos archivos simplemente existen por razones históricas, especialmente la forma en que los diferentes proyectiles evolucionaron y tomaron prestadas características útiles entre sí. Además, no se saben reglas estrictas que

Definir qué archivo está destinado a mantener una cierta pieza de la configuración. Estas son las recomendaciones que tenemos para usted (basadas en TLDP [10]):

  • Todas las configuraciones que desea aplicar a todos los entornos de sus usuarios debe estar en /etc /perfil.
  • Todos los alias y funciones globales deben almacenarse en /etc /bashrc.
  • El archivo ~/.Bash_profile es el archivo de configuración preferido para configurar entornos de usuario individualmente. En este archivo, los usuarios pueden agregar opciones de configuración adicionales o cambiar la configuración predeterminada.
  • Todos los alias y funciones locales deben almacenarse en ~/.bashrc.

Además, tenga en cuenta que Linux está diseñado para ser muy flexible: si alguno de los archivos de inicio mencionados anteriormente no está presente en su sistema, puede crearlo.

Enlaces y referencias

  • [1] GNU Bash, https: // www.ñu.org/software/bash/
  • [2] Debian Almquist Shell (Dash), http: // gondor.apana.organizar.Au/~ Herbert/Dash/
  • [3] ZSH, https: // www.zsh.org/
  • [4] Certificación del Instituto Profesional de Linux (LPIC), Nivel 1, https: // www.lpice.EU/EN/NUESTROS Certificaciones/LPIC-1
  • [5] Grml, https: // grml.org/
  • [6] Diferenciar el inicio de sesión interactivo y la carcasa no login no interactiva, Askubuntu, https: // askubuntu.com/preguntas/879364/diferenciar interactiva-login y no interactiva-no-login-shell
  • [7] Archivos de inicio de Bash, https: // www.ñu.org/software/bash/manual/html_node/bash-startup-file.html#bash-startup-archivos
  • [8] The Shopt Builtin, https: // www.ñu.org/software/bash/manual/html_node/the-shopt-builtin.html
  • [9] Introducción de UNIX - Orden de carga de archivos de inicio de BASH, https: // medio.com/@Youngstone89/Unix-Introduction-Bash-Startup-Files-Loading-orden-562543AC12E9
  • [10] El proyecto de documentación de Linux (TLDP), https: // tldp.org/ldp/bash-beginners-guide/html/sect_03_01.html

Gracias

El autor desea agradecer a Gerold Rupprecht por su consejo mientras escribe este artículo.