domingo, 24 de septiembre de 2017

El Entorno

Como vimos antes, el shell mantiene una cantidad de información durante nuestra sesión de shell llamada el entorno. Los datos almacenados en el entorno los usan los programas para determinar cosas acerca de nuestra configuración. Mientras que la mayoría de programas usan archivos de configuración para almacenar las configuraciones del programa, algunos programas también buscan valores almacenados en el entorno para ajustar su comportamiento. Sabiendo ésto, podemos usar el entorno para personalizar nuestra experiencia con el shell.

En éste capítulo, trabajaremos con los siguientes comandos:

  • printenv – Imprime parte o todo el entorno
  • set – Establece opciones del shell
  • export – Exporta el entorno a los programas que se ejecuten a continuación
  • alias – Crea un alias para un comando
¿Qué se almacena en el entorno?

El shell almacena dos tipos básicos de datos en el entorno, con bash, los dos tipos son casi indistinguibles. Hay variables de entorno y variables de shell. Las variables de shell son bits de datos puestos allí por bash, y las variables de entorno son básicamente todo lo demás. Además de las variables, el shell también almacena algunos datos programáticos, llamados alias y funciones de shell. Veremos los alias en el Capítulo 5, y las funciones de shell (que están relacionadas con los scripts de shell) las veremos en la Parte 4.

Examinando el entorno


Para ver que hay almacenado en el entorno, podemos usar el set integrado en bash o el programa printenv. El comando set nos mostrará tanto las variables del shell como las del entorno, mientras que printenv sólo mostrará éstas últimas. Como nuestra lista de contenidos del entorno será muy larga, es mejor pasar la salida de cada comando por un pipe hacia less:

 [me@linuxbox ~]$ printenv | less

Hacíendolo, deberíamos obtener algo parecido a ésto:

KDE_MULTIHEAD=falseSSH_AGENT_PID=6666HOSTNAME=linuxboxGPG_AGENT_INFO=/tmp/gpg-PdOt7g/S.gpg-agent:6689:1SHELL=/bin/bashTERM=xtermXDG_MENU_PREFIX=kde-HISTSIZE=1000XDG_SESSION_COOKIE=6d7b05c65846c3eaf3101b0046bd2b00-1208521990.996705-1177056199GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/home/me/.gtkrc-2.0:/home/me/.kde/share/config/gtkrc-2.0GTK_RC_FILES=/etc/gtk/gtkrc:/home/me/.gtkrc:/home/me/.kde/share/config/gtkrcGS_LIB=/home/me/.fontsWINDOWID=29360136QTDIR=/usr/lib/qt-3.3QTINC=/usr/lib/qt-3.3/includeKDE_FULL_SESSION=trueUSER=meLS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe:

Lo que vemos es una lista de las variables de entorno y sus valores. Por ejemplo, vemos una variable llamada USER, que contiene el valor “me”. El comando printenv puede listar también el valor de una variable específica:

 [me@linuxbox ~]$ printenv USERme

El comando set, cuando lo usamos sin opciones o argumentos, mostrará tanto las variables del shell como las del entorno, así como cualquier función definida del shell. Al contrario de printenv, su salida está cortésmente ordenada alfabéticamente:

 [me@linuxbox ~]$ set | less

También es posible ver el contenido de una variable usando el comando echo, así:

 [me@linuxbox ~]$ echo $HOME/home/me

Un elemento del entorno que ni set ni printenv muestran son los alias. Para verlos, introduce el comando alias sin argumentos:

[me@linuxbox ~]$ alias

alias l.='ls -d .* -- color=tty'alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias vi='vim'alias which='alias | /usr/bin/which --tty-only --read-alias --show
dot --show-tilde'

Algunas variables interesantes

El entorno contiene unas pocas variables, y sin embargo tu entorno puede diferir del presentado aquí, verás más o menos las siguientes variables en tu entorno:

Variables de entorno

DISPLAY
El nombre de tu pantalla si estás corriendo un entorno gráfico. Normalmente es “:0”, que significa la primera pantalla generada por el servidor X.

EDITOR
El nombre del programa que se usa para editar texto.

SHELL
El nombre de tu programa de shell

HOME
La ruta de tu directorio home.

LANG
Define la configuración de caracteres y el orden de colación de tu idioma.

OLD_PWD
El anterior directorio de trabajo.

PAGER
El nombre del programa que se usa para paginar la salida. A menudo está establecido en /usr/bin/less.

PATH
Una lista separada por puntos de los directorios en que se busca cuando introduces el nombre de un programa ejecutable.

PS1
Prompt String 1. Define el contenido de tu prompt de shell. Como veremos más tarde, puede ser ampliamente personalizado.

PWD
El directorio de trabajo actual.

TERM
El nombre de tu tipo de terminal. Los sistemas como-Unix soportan muchos protocolos de terminal; esta variable establece el protocolo que se va a usar con tu emulador de terminal.

TZ
Especifica tu zona horaria. La mayoría de los sistemas como-Unix mantienen un reloj interno en el ordenador en Coordinated Universal Time (UTC) y luego muestran la hora local aplicando un desfase especificado por esta variable.

USER
Tu nombre de usuario.

¿Cómo se establece el entorno?


Cuando nos identificamos en el sistema, el programa bash arranca, y lee una serie de scripts de configuración llamados archivos de arranque (startup files), que definen el entorno por defecto compartido para todos los usuarios. A continuación se leen más archivos de arranque en tu directorio home que definen tu entorno personal. La secuencia exacta depende del tipo de sesión de shell que se inicie. Hay dos tipos: sesión de shell con login y sesión de shell sin login.

Una sesión de shell con login es aquella en la que nos preguntan nuestro nombre de usuario y contraseña; cuando arrancamos una sesión de consola virtual, por ejemplo. Un sesión de shell sin login es la que típicamente se da cuando arrancamos una sesión de terminal en la GUI.

Los login de shell leen uno o más archivos de arranque:

Archivos de arranque para sesiones de shell con login

/etc/profile
Un script configuración global que se aplica a todos los usuarios.

~/.bash_profile
Un archivo de arranca personal del usuario. Puede utilizarse para extender o sobrescribir configuraciones del script de configuración global.

~/.bash_login
Si ~/.bash_profile no se encuentra, bash intenta leer este script.

~/.profile
Si no se encuentran ni ~/.bash_profile ni ~/.bash_login, bash intenta leer este archivo. Éste es el que vieme por defecto en las distribuciones basadas en Debian, como Ubuntu.
Las sesiones de shell sin login leen los siguientes archivos de arranque:

Archivos de arranque para sesiones de shell sin login

/etc/bash.bashrc
Un script de configuración global que se aplica a todos los usuarios

~/.bashrc
Un archivo de arranque personal del usuario. Puede usarse para extender o sustituir las configuraciones del script de configuración global.
Echa un vistazo a tu sistema y mira cuales de estos archivos de arranque tienes. Recuerda – como la mayoría de los archivos listados anteriormente empiezan con un punto (que significa que están ocultos), necesitarás usar la opción “-a” cuando uses ls.

El archivo ~/.bashrc es probablemente el archivo de arranque más importante desde el punto de vista de un usuario normal, ya que casi siempre se lee. Los shell sin login lo leen por defecto y la mayoría de archivos de arranque para los shell con login se escriben de forma que lean el archivo ~/.bash_login también.

¿Qué hay en un archivo de arranque?


Si miramos dentro de una archivo .bash_profile típico (tomado de un sistema CentOS), vemos algo así:

# .bash_profile# Get the aliases and functions

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# User specific environment and startup 
 programs 

PATH=$PATH:$HOME/bin
export PATH

Las líneas que empiezan con un “#” son comentarios y no son leídas por el shell. Son para que sean legibles por personas. La primera cosa interesante ocurre en la cuarta línea, con el siguiente código:

 if [ -f ~/.bashrc ]; then. ~/.bashrcfi

Ésto se llama un comando if compuesto, que veremos más en profundidad cuando lleguemos al scripting de shell en la Parte 4, pero por ahora lo traduciremos:

If the file "~/.bashrc" exists, then

    read the "~/.bashrc" file.

Podemos ver que este fragmento de código es la forma en que un shell con login toma los contenidos de .bashrc. Lo siguiente en nuestros archivo de arranque tiene que ver con la variable PATH.

¿Te has preguntado alguna vez como sabe el shell donde encontrar los comandos cuando los introducimos en la linea de comandos? Por ejemplo, cuando introducimos ls, el shell no busca en todo el ordenador para encontrar /bin/ls (la ruta completa del comando ls), en su lugar, busca en una lista de directorios que están contenidos en la variable PATH.

La variable PATH a menudo (pero no siempre, depende de la distribución) es establecida por el archivo de arranque /etc/profile con éste código:

 PATH=$PATH:$HOME/bin

PATH se modifica para añadir el directorio $HOME/bin al final de la lista. Ésto es un ejemplo de expansión con parámetros, como vimos en el Capítulo 7. Para demostrar como funciona, prueba lo siguiente:
     
 [me@linuxbox ~]$ foo="This is some "
 [me@linuxbox ~]$ echo $foo 
 This is some
 [me@linuxbox ~]$ foo=$foo"text." 
 [me@linuxbox ~]$ echo $foo
 This is some text.

Usando esta técnica, podemos añadir texto al final de los contenidos de una variable.
Añadiendo la cadena $HOME/bin al final del contenido de la variable PATH, el directorio $HOME/bin se añade a la lista de directorios a buscar cuando se introduce un comando. Ésto significa que cuando queremos crear un directorio dentro de nuestro directorio home para almacenar nuestros programas privados, el shell está preparado para contenerlos. Todo lo que tenemos que hacer es llamarlo bin, y estamos listos para empezar.

Nota: Muchas distribuciones proveen esta configuración de PATH por defecto. Algunas distribuciones basadas en Debian, como Ubuntu, buscan la existencia del directorio ~/bin en el login, y dinámicamente lo añaden a la variable PATH si encuentran el directorio.

Finalmente, tenemos:

 export PATH

El comando export le dice al shell que haga que los contenidos de PATH estén disponibles para los pro esos hijos de este shell.

Modificando el entorno


Como ya sabemos donde están los archivos de arranque y que contienen, podemos modificarlos para personalizar nuestro entorno.

¿Qúe archivos podríamos modificar?


Como regla general, para añadir directorios a tu PATH, o definir variables de entorno adicionales, coloca dichos cambios en .bash_profile (o equivalente, según tu distribución. Por ejemplo, Ubuntu usa .profile.) Para todo lo demás, coloca los cambios en .bashrc. A menos que seas el administrador del sistema y necesites cambiar los predefinidos para todos los usuarios del sistema, reduce tus modificaciones a los archivos de tu directorio home. En realidad es posible cambiar los archivos en /etc como profile, y en muchos casos sería sensato hacerlo, pero por ahora, juguemos con seguridad.

Editores de texto


Para editar (p.ej., modificar) los archivos de arranque de shell, así como la mayoría del resto de configuraciones del sistema, usamos un programa llamado editor de texto. Un editor de texto es un programa que es, de algún modo, como un procesador de texto en que podemos editar las palabras que hay en la pantalla con un movimiento del cursor. Difiere de un procesador de texto en que sólo soporta texto plano, y a menudo contiene funciones diseñadas para programas de escritura. Los editores de texto son la herramienta central usada por los desarrolladores de software para escribir código, y por los administradores de sistema para manejar los archivos de configuración que controlan el sistema.

Hay muchos editores de textos diferentes disponibles para Linux; tu sistema probablemente tenga varios instalados. ¿Por qué hay tantos diferentes? Probablemente porque a los programadores les gusta escribirlos, y como los programadores los usan intensamente, escriben editores para expresar sus propios deseos sobre cómo deberían funcionar.

Los editores de texto se clasifican en dos categorías básicas: gráficos y basados en texto. GNOME y KDE incluyen algunos editores gráficos populares. GNOME cuenta con un editor llamado gedit, que usualmente es llamado “Editor de Texto” en el menú de GNOME. KDE normalmente cuenta con tres que son (en orden de complejidad creciente) kedit, kwrite y kate.

Hay muchos editores basados en texto. Los más populares que encontrarás son nano, vi, y emacs. El editor nano es un editor simple y fácil de usar diseñado como un sustituto del editor pico proporcionado por la suite de email PINE. El editor vi (en la mayoría de los sistemas Linux sustituido por un programa llamado vim, que es la abreviatura de “Vi Improved” - “Vi mejorado”) es el editor tradicional de los sistemas como-Unix. Será el objeto de nuestro próximo capítulo. El editor emacs fue originalmente escrito por Richard Stallman. Es un entorno de programación gigantesco, multi-propósito y hacelo-todo. Aunque está fácilmente disponible, rara vez viene instalado en los sistemas Linux por defecto.

Usando un editor de texto


Todos los editores de texto pueden ser llamados desde la línea de comandos escribiendo el nombre del editor seguido del nombre del archivo que queremos editar. Si el archivo todavía no existe, el editor asume que queremos crear un nuevo archivo. Aquí tenemos un ejemplo usando gedit:

 [me@linuxbox ~]$ gedit some_file

Este comando arrancará el editor de texto gedit y cargará el archivo llamado “some_file”, si existe.

Todos los editores gráficos son muy auto-explicativos, así que no los veremos aquí. En su lugar, nos concentraremos en nuestro primer editor de texto basado en texto, nano. Arranquemos nano y editemos el archivo .bashrc. Pero antes de hacerlo, practiquemos algo de “informática segura”. Cada vez que editamos un archivo de configuración importante, siempre es una buena idea crear una copia de seguridad del archivo primero. Esto nos protege en caso de que estropeemos el archivo mientras lo editamos. Para crear una copia de seguridad del archivo .bashrc, haz esto:

 [me@linuxbox ~]$ cp .bashrc .bashrc.bak

No importa como llames al archivo de copia de seguridad, sólo escoge un nombre comprensible. Las extensiones “.bak”, “.sav”, “.old” y “.orig” son las formas más populares de indicar que es un archivo de copia de seguridad. Ah, y recuerda que cp sobrescribirá los archivos existentes silenciosamente.

Ahora que tenemos un archivo de copia de seguridad, arrancaremos el editor:

 [me@linuxbox ~]$ nano .bashrc

Una vez que nano arranca, tendremos una pantalla como esta:

 GNU nano 2.0.3 File: .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi


# User specific aliases and functions

¿Por qué son importantes los comentarios?


Siempre que modificas archivos de configuración es una buena idea añadir algunos comentarios para documentar tus cambios. Seguro que recordarás lo que has cambiado mañana, pero ¿qué pasará dentro de seis meses? Hazte un favor y añade algunos comentarios. Mientras estás en ello, no es mala idea guardar un registro de los cambios que haces.

Los scripts de shell y los archivos de arranque de bash usan el símbolo “#” para comenzar un comentario. Otros archivos de configuración pueden usar otros símbolos. La mayoría de los archivos de configuración tendrán comentarios. Úsalos como guía.

A menudo verás líneas en archivos de configuración que está comentadas para evitar que sean usadas por el programa afectado. Ésto se hace para dar al lector recomendaciones para posibles configuraciones o ejemplos de la sintaxis de configuración correcta. Por ejemplo, el archivo .bashrc de Ubuntu 8.04 contiene estas líneas:

# some more ls aliases

#alias ll='ls -l'#alias 
la='ls -A'#alias l='ls -CF'

Las últimas tres lineas son definiciones válidas de alias que han sido comentadas. Si eliminas los símbolos “#” de delante de las tres lineas, una técnica llamada descomentar, activarás los alias. Inversamente, si añades un símbolo “#” al principio de una linea, puedes desactivar una linea de configuración mientras que conservas la información que contiene.

Activando nuestros cambios


Los cambios que hemos hecho a nuestro .bashrc no tendrán efecto hasta que cerremos nuestra sesión de terminal y arranquemos una nueva, ya que el archivo .bashrc sólo se lee al principio de la sesión. Sin embargo, podemos forzar que bash relea el .bashrc modificado con el siguiente comando:

 [me@linuxbox ~]$ source .bashrc

Después de hacer esto, deberíamos poder ver el efecto de nuestros cambios. Prueba uno de los nuevos alias:

 [me@linuxbox ~]$ ll

Resumiendo


En este capítulo hemos aprendido una habilidad esencial – editar archivos de configuración con un editor de texto. Continuando, tal como leemos man pages para los comandos, toma nota de las variables de entorno que soportan los comandos. Puede haber un par de joyas. En capítulos posteriores, aprenderemos las funciones de shell, una característica poderosa que podrás incluir en los archivos de arranque de bash y añadir a tu arsenal de comandos personalizados.


Para saber más

  • La sección INVOCATION de la man page de bash cubre los archivos de arranque de bash al detalle.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.