El Shell

Rafa Morales 11 Septiembre 2013
8min
0
Linux

El shell es el intérprete de comandos u órdenes de Linux. Es el equivalente al símbolo del sistema de Windows o al antiguo MS-DOS. En él se introducen órdenes, se ejecutan programas, etc. Actúa como interfaz entre el usuario y el hardware.

Además el shell incorpora un lenguaje de programación con el que realizar scripts interactivos.

Existen diferentes versiones de shell según la distribución de GNU/Linux con la que trabajemos:

  • Shell Bourne (sh): Creado por S. Bourne, es uno de los más utilizado en la actualidad. El prompt del sistema queda representado por el símbolo $.

  • C-Shell (csh): Proporciona características como control de procesos, historial de órdenes, capacidades de edición, etc. Ofrece importantes características para los programadores de C. Su prompt se representa con el símbolo %.

  • Shell job (jsb): Incorpora algunas características de control al shell estándar (sh).

  • Shell Korn (ksh): Escrito por David Korn, amplía el shell del sistema añadiendo historial de órdenes, ediciones de la línea de comandos y características ampliadas de programación.

  • Bourne Again Shell (Bash): Fue creado para utilizarlo en el proyecto GNU/Linux, compatible con el shell sh. Incorpora características útiles de ksh y csh, y otras propias como la edición de línea de comandos, tamaño ilimitado del historial de órdenes, control de procesos, funciones, alias, etc.

En la ventana del Shell siempre encontramos un texto que precede a nuestra entrada de texto, es conocido como prompt. Normalmente indica el directorio en el que nos encontramos, pero es totalmente personalizable. Como regla general, si el prompt termina en el símbolo $, nos indicará que estamos trabajando con un usuario normal del sistema, pero si termina con el símbolo #, querrá decir que estamos trabajando con el usuario root.



Combinaciones de teclas dentro del Shell

  • Flecha Arriba: Mostrará uno a uno todos los comandos ejecutados anteriormente por el usuario en el shell, en ordén del último al primero.

  • Tabulador: Cuando se está escribiendo el nombre de un comando, archivo o directorio completa su nombre. Si existieran varias posibilidades se mostraría una lista con todas ellas y deberíamos de seguir escribiendo para poder autocompletar después.

  • Mayús+AvPág o Mayús+RePág: Sube o baja dentro del shell para poder ver la salida anterior de los comandos que se salen de pantalla. Es como mover el scroll en una ventana.

 

Configuración de BASH

Existen varios ficheros en el directorio de un usuario (/home/usuario) que tienen un significado especial para el shell Bash. Estos ficheros permiten al usuario configurar el entorno de su cuenta automáticamente cuando entra en el sistema, cuando arranca un subshell o ejecutar comandos cuando sale del sistema.

Los nombres de estos ficheros son:

 

  • .bash_profile

Es el más importante, es leído y, los comandos incluidos en él ejecutados, cada vez que el usuario hace login en el sistema. Cualquier cambio hecho en este fichero no tendrá efecto hasta que salgamos y entremos en el shell de nuevo. Una alternativa para no tener que salir del sistema es ejecutar el comando:

source .bash_source

Bash permite dos sinónimos para este fichero, .bash_login (derivado del C shell) y .profile (derivado del Bourne y Korn shell). Si .bash_profile no existe, el sistema buscará primero .bash_login y luego .profile. Solamente uno de estos ficheros es leído, en el caso que existan simultáneamente.

 

  • .bashrc

Es leído cuando el usuario arranca un subshell o terminal sin hacer login, escribiendo por ejemplo bash en la línea de comandos. Esto nos permite ejecutar diferentes comandos para la entrada al sistema o para la ejecución de un subshell. Si el usuario necesita los mismos comandos tanto en el login como en subshells, podemos incluir la línea source .bash_source en .bashrc.

 

  • .bash_logout

Es el fichero leído por Bash, cuando salimos del sistema. Podemos definir, por ejemplo que se borren los ficheros temporales creados en nuestra ultima sesión o registrar el tiempo que hemos estado utilizando el sistema. Si .bash_logout no existe, ningún comando será ejecutado a nuestra salida.

 

  • .bash_history

Es el fichero que contiene los últimos comandos ejecutados desde una terminal por el usuario. Este fichero se actualiza cada vez que el usuario cierra la terminal.

history

Con este comando se muestra por pantalla una lista numerada con todos los comandos almacenados en el fichero .bash_history más los comandos actuales que se han ejecutado desde que se abrió la terminal y que se encuentran en el buffer antes de almacenarse en dicho archivo.

!xxx

Con el signo de admiración seguido de un comando o parte de éste, se ejecutará la última línea que comience de la misma manera almacenada en el fichero.

!208

Con el signo de admiración seguido de un número, se ejecutará el comando almacenado en esa línea dentro del fichero.

Si queremos que no se recuerde en el history algunos de los comandos que escribimos, como por ejemplo el ssh, debemos incluir la siguiente línea dentro del archivo .bashrc:

HISTIGNORE='ere*:ssh*'

Y si queremos que no se recuerde el comando que estamos escribiendo en este momento, sólamente debemos dejar un espacio en blanco delante del mismo:

[espacio_en_blanco] comando

 

Si ninguno de estos ficheros existe en el directorio del usuario, /etc/profile es utilizado por el sistema como fichero de configuración por defecto de bash.

 

Variables de entorno

Las variables de entorno proporcionan una manera de influir en el comportamiento del software en el sistema. Por ejemplo, la variable de entorno LANG determina el idioma en el que los programas de software se comunican con el usuario.

Las variables de entorno consisten en nombres que tienen valores asignados a ellos. Por ejemplo, en un sistema típico en español, el valor asignado a LANG sería es_ES.UTF-8.

Para crear una variable de entorno solo debemos exportarla mediante una asignación de un valor a una variable en cualquier lenguaje de programación:

export EDITOR=nano

Los nombres de las variables son sensibles a las mayúsculas y minúsculas como todo en cualquier sistema Linux. Se suelen utilizar guiones bajos y letras mayúsculas solamente.

Para visualizar por pantalla el valor de todas las variables de entorno de nuestro SHELL o el de una en concreto utilizamos el siguiente comando:

printenv

printenv EDITOR

También podemos ejecutar el siguiente comando para visualizar las variables de entorno:

env

Utilizando el signo del dólar delante de la variable la podemos utilizar en cualquier comando que ejecutemos en nuestra SHELL. Por ejemplo:

echo $EDITOR
ls $HOME/Escritorio

Para eliminar completamente variables de entorno en nuestro SHELL existen dos maneras posibles:

unset EDITOR

export –n EDITOR

Los valores de las variables de entorno son locales, lo que significa que son específicas para el proceso que se ejecuta. Esto significa que si abrimos dos terminales y cambiamos el valor de una variable de entorno en una de las terminales, el cambio no se verá en la otra terminal.

Las variables también se rigen por la herencia. Cuando un proceso padre crea un proceso hijo, el proceso hijo hereda todas las variables de entorno y valores que el proceso padre tenía en un principio, pero si el padre las modifica alguno de sus valores, estos cambios ya no se heredan.

Las variables de entorno creadas anteriormente solo durarán mientras tengamos abierta la terminal en la que fueron creadas, por lo que son variables temporales. Para conseguir que las variables de entorno sean permanentes debemos crearlas en los siguientes ficheros:

 

~/.bashrc

Para que sean permanentes solo en un usuario concreto. Se declaran con la palabra export.

 

/etc/environment

Para que sean permanentes para todo el sistema. Se declaran sin la palabra export.

 

Algunas de las variables de entorno más comunes que podemos encontrar en los sistemas Linux son las siguientes:

PATH = Directorios donde el sistema buscará los comandos a ejecutar.

HOME = Ruta del directorio home del usuario.

USER = Nombre del usuario.

PWD = Directorio actual de trabajo.

TERM = Nombre del terminal de trabajo.