Google
Web dns.bdat.net

Shell

La shell es el intérprete de órdenes que utiliza Linux, bueno Unix en general. No hay una sola shell, sino que cada usuario puede elegir la que quiera en cada momento. Además las shells funcionan como lenguajes de programación de alto nivel, lo que se estuaciará en un capítulo posterior.

En principio hay dos familias de shell, las shell de Bourne y las shell C. Dentro de cada una de ellas hay diferentes vesiones, como por ejemplo ksh (Korn shell) o bash (Bourne Again Shell),. Nosotros en Linux vamos a usar esta última, aunque gran parte de las cosas son aplicables a otras shell.

Definiciones

Variables de shell

Una variable de shell es una zona de almacenamiento de información con un nombre que la identifica. Para no liarnos mucho, es similar a un variable en lenguaje C. Podemos asignar un valor a una variable mediante el operador ?=?. Si la variable no existe el operador ?=? la crea. No se debe dejar espacio entre el nombre de la variable y el operador de asignación (=).

Para usar el valor de una variable es necesario anteponerle el símbolo ?$?.

Ejemplos:

$ AA=Hola que tal
$ echo AA
$ echo $AA
                

Como norma de estilo, se suelen usar letras mayúscular para definir los nombres de las variables.

Variables de entorno

Son variables que tienen un significado propio para la shell o algún otro programa. Ciertos programas leen el contenido de las variables de entorno par mosificar su comportamiento, entre ellos la propia shell.

Entre la variables de entorno más importantes podemos citar:

  • PATH Indica la ruta de búsqueda de programas ejecutables. Está constituida por una lista de directorios separados por ?:?. El directorio actual, de forma predeterminada, no viene incluida en PATH.

  • PS1 Especifica el indicador del sistema. Lo habitual es que PS1 sea ?$? para usuarios normales y ?#? para root.

  • PS2 Especifica el indicador secundario del sistema. Aparece cuando no se ha completado una orden.

  • LANG Especifica el lenguaje que se aplica al usuario. Para español se utiliza ?es?.

  • LC_ALL Contiene el idioma y se utoiliza para usar los valores locales como mensajes del sistema, símbolo monetario, formato de fecha, formato de números decimales y otras características.

  • TERM Indica el tipo de teminal que se está utilizando. Por ejemplo, si estamos en la consola el valor de TERM será ?linux?, para usar las carácterísticas del teclado. Si entramos por telnet desde w9x entonces probablemente tengamos que poner vt100.

  • EDITOR Especifica el editor por omisión del sistema. Lo habitual en los sistema Unix es que el editor por omisión sea ?vi?.

  • DISPLAY Especifica qué equipo muestra la salida que se efectúa en modo gráfico. Ese equipo deberá tener un servidor gráfico.

  • LD_LIBRARY_PATH Esta variable se utiliza para definir rutas alternativas de búsqueda de para bibliotecas de funciones del sistema.

  • PWD Contiene el directorio de trabajo efectivo.

Con la orden env (environment) podemos comprobar el valor de las variables de entorno del sistema. Para modificarlas basta asignarle un nuevo valor.

Ejemplo:

$ env
PWD=/home/usuario/public_html/docs/shell
LTDL_LIBRARY_PATH=/home/usuario/.kde/lib:/usr/lib 
HOSTNAME=www.bdat.com 
LD_LIBRARY_PATH=/home/usuario/.kde/lib:/usr/lib 
QTDIR=/usr/lib/qt-2.2.2 
CLASSPATH=./:/usr/lib/jdk118/lib/classes.zip 
LESSOPEN=|/usr/bin/lesspipe.sh %s  
PS1=[\u(EN)\h\W]$ 
KDEDIR=/usr 
BROWSER=/usr/bin/netscape 
USER=usuario
MACHTYPE=i386-redhat-linux-gnu 
LC_ALL=es_ES 
MAIL=/var/spool/mail/usuario 
EDITOR=joe 
LANG=es
COLORTERM=
DISPLAY=:0
LOGNAME=usuario 
SHLVL=4 
LC_CTYPE=iso-8859-1 
SESSION_MANAGER=local/www.bdat.com:/tmp/.ICE-unix/965 
SHELL=/bin/bash 
HOSTTYPE=i386 
OSTYPE=linux-gnu 
HISTSIZE=100 
HOME=/home/usuario 
TERM=xterm 
PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/lib/jdk118/bin:./:/sbin:/usr/sbin:/usr/local/sbin:/opt/netscape 
GROFF_TYPESETTER=latin1 
LESSCHARSET=latin1
                

Ficheros ejecutables

Un fichero ejecutable es un fichero que tenga asignado el permiso de ejecución.

Los ficheros ejecutables pueden ser de dos tipos:

Binarios, cuando son resultado de la compilación de un programa, por ejemplo en C.

Programas de shell, llamados scripts o guiones. Son ficheros de texto que contienen órdenes de shell y son interpretados por una shell.

Como ya dije anteriormente, un sistema unix reconoce un fichero como ejecutable por disponer del permiso de ejecución activo, no por ningún tipo de extensión en el nombr del fichero.

Shell y subshell

Podemos abrir una nueva shell simplemente ejecutando el fichero binario que contiene la shell.

También, cuando ejecutamos un script se abre una nueva shell que es la encargada de ir interpretando las diferentes órdenes y de mantener el valor de las variables definidas. Esta subshell tiene como tiempo de vida el tiempo de ejecución del script. Además esta subshell hereda el valor de parte de las variables de entorno, pero en su propio espacio de memoria, por lo que las modificaciones de cualquier variable de la nueva shell no tendrá repercusión en la shell padre.

Cerrar una shell

Para cerrar una shell usamos la orden exit. Esta orden termina la ejecución de la shell y vuelve a la shell padre. Si ejecutamos la orden exit sobre la shell inicial que abrimos al entrar al sistema (llamada login shell) entonces terminamos la sesión de trabajo.

Variables exportadas

En el apartado anterior, veíamos que una subshell hereda parte de las variables definidas en la la shell padre. Para que las shell hijas de una dterminada shell hereden una variable es necesario indicarlo explícitamente con la orden export. Por ejemplo, si queremos que el valor de la variable EDITOR pase a las subshell que sean hijas de la shell activa, tendremos que poner

$ export EDITOR
                

En la shell bash, podemos realizar en una sola operación la asignación de una valor y exportarla, por ejemplo

$ export EDITOR=vi
                

No todas las shell permiten esta operación

Ejemplos:

Asignar la palabra contenido a una variable llamada AA

$ AA=contenido
                

Mostrar el contenido de la variable en pantalla.

$ echo $AA
                

Abrir una shell hija de la anterior.

$ /bin/bash
                

Mostrar de nuevo el contenido de la variable

$ echo $AA
                

Salir de la subshell activa

$ exit
                

Mostrar de nuevo el contenido de la variable

$ echo $AA
                

Exportar la variable

$ export AA
                

Abrir una shell hija de la anterior.

$ /bin/bash
                

Mostrar de nuevo el contenido de la variable

$ echo $AA