La shell de Unix

INTRODUCCIÓN

Una gran parte del uso del Sistema UNIX consiste en que el usuario emitir órdenes y UNIX responde. Para realizar esta labor, el usuario no se comunica directamente con el núcleo de UNIX sino que lo hace a través del intérprete de comandos o shell. Por lo tanto, el shell no es más que un intermediario entre el núcleo de UNIX y el usuario. Cuando se emite una orden nos relacionamos con el shell.

Uno de los aspectos más novedosos de la shell de UNIX, en el momento de su creación, fue que además de ser un intérprete de órdenes era un lenguaje de programación para la ejecución de scripts por el sistema operativo. Como intérprete de órdenes, el shell lee los comandos que se le introducen y dispone lo necesario para que se ejecuten. Además se puede utilizar el lenguaje de órdenes del shell como un lenguaje de programación de alto nivel para crear programas denominados guiones (scripts).

TIPOS DE SHELL

Existen varios tipos de shell:

  • La shell estándar es el Bourne Shell, conocido como lenguaje sh distribuído en la versión AT&T de UNIX. La versión original fue desarrollada por Stephen Bourne en los Laboratorios Bell. (System V).
  • Otra de las shells más difundida es el C Shell (csh), desarrollado en la Universidad de Berkeley en su mayor parte por Bill Joy. Fue diseñado teniendo en cuenta que los usuarios serían programadores en lenguaje C, distribuyéndose en la versión BSD de UNIX.
  • Otra versión ampliamente difundida es el Korn Shell (ksh), que recibe el nombre de su creador, David Korn.
  • Por ultimo existe el shell BASH (Bourne Again Shelll) que unifica las características del csh y ksh junto con la version inicial del Bourne Shell (sh)

El shell C y el shell Korn se desarrollaron para disponer de características y capacidades adicionales que no ofrecía el sh. Comparado con sh, tanto csh como ksh disponen de un número de ampliaciones valiosas. Entre ellos están la edición de línea de orden, que posibilita editar las líneas de órdenes cuando se introducen; las listas de historias de órdenes, que permite revisar las órdenes que se han venido utilizando durante una sesión, y los alias de órdenes, que se pueden utilizar para dar a las órdenes nombres más convenientes. csh y ksh también proporcionan la posibilidad de utilizar órdenes desde una lista de comandos ya introducidos para simplificar la creación de órdenes nuevas, la protección de sobreescritura accidental en archivos existentes cuando se redirige la salida hacia ellos, etc

LA SHELL BOURNE (SH) DE UNIX SYSTEM V.

Cuando se inicia una sesión de trabajo en una instancia de UNIX en modo consola, se inicia automáticamente un programa de shell. Este es el shell de presentación. El programa de shell particular que se ejecuta cuando se inicia sesión se puede configurar a través del archivo /etc/passwd. La shell de Bourne usa una sintaxis de comandos como la usada en los primeros sistemas UNIX, como el System III. La shell de Bourne no es más que un programa más del sistema operativo UNIX, cuyo ejecutable puede encontrarte en la gran mayoría de sistemas UNIX (como BSD de Berkeley) en el path /bin/sh. Cabe destacar que en otros sistemas UNIX como Linux la shell que se encuentra en /bin/sh es una shell compatible con la shell Bourne pero con un mayor número de características. El estándar POSIX especifica que su shell es un subconjunto de la shell Korn.

Cuando se inicia la shell, se ejecuta un archivo denominado .profile que se encuentra en el directorio home del usuario. Este archivo contiene órdenes que personalizan el entorno de cada usuario, siendo el equivalente al fichero autoexec.bat de MS-DOS® . El shell lee este archivo y lleva a cabo las instrucciones que contiene. El .profile es un ejemplo simple de guión de shell o script puesto que contiene a su vez órdenes o instrucciones para el shell y se utiliza para la personalización del entorno de trabajo: la definición de la variable PATH, fijar el tipo de terminal, cambiar el prompt por defecto, etc.

El shell informa que está listo para recibir una entrada del usuario visualizando una petición de orden. Por defecto, sh utiliza los siguientes signos de petición de orden:

  • el signo dólar, $, como signo de petición de orden principal o primaria para los usuarios normales.
  • y el signo sostenido # como signo de petición de ordenes para el root o administrador.

Para terminar la sesión en UNIX se teclea CTRL+D, o la orden exit.

El diálogo con la shell de UNIX sigue una secuencia simple repetida una y otra vez. El shell solicita una orden y espera su introducción. Se introduce una orden tecleando una línea de orden. El shell procesa la línea de orden para determinar las acciones que debe llevar a cabo y muestra el resultado. Después de finalizar el programa, el shell solicita otra orden comenzando otro ciclo.

ORDENES DE ENTRADA PARA LA SHELL.

En general, una línea de orden o línea de comandos contiene un comando y argumentos. El shell no comienza a procesar la línea de orden hasta que recibe un RETURN. Los argumentos de la línea de comandos son opciones que modifican lo que hace una orden y cómo lo hace, y la información que necesita, como puede ser el nombre de un archivo del que obtener datos. Las opciones normalmente se indican con un signo.

A menudo la línea de orden incluye argumentos y símbolos que son realmente instrucciones para el shell:

  • El símbolo > se utiliza para dirigir la salida de una orden a un archivo
  • El símbolo de cauce (pipe), I, se utiliza para redirijir la salida de una orden como entrada a otra.
  • El símbolo ampersand, &, sirve para ejecutar una orden en el modo subordinado, que se ejecuta en segundo plano devolviendo el foco principal a la shell.

Normalmente se coloca una única orden o un cauce de dos o más órdenes en una única línea. Si es necesario se pueden introducir varias órdenes de una vez en una línea separándolas con punto y coma. Por ejemplo, la línea de orden siguiente dice al shell que ejecute en primer lugar pwd (vuelva en pantalla el directorio actual), y después ls, de la misma forma que se hubiese hecho tecleando cada una de las órdenes en una línea independiente.

$ pwd; ls

EXPRESIONES REGULARES Y CARÁCTERES COMODÍN INTERPRETADOS POR LA SHELL.

El shell proporciona una forma de abreviar los nombres de archivos mediante el uso de patrones especiales o comodines que se utilizan para especificar uno más archivos sin tener que escribir los nombres completos. Se pueden utilizar comodines para especificar de una sola vez un conjunto completo de archivos, o para buscar un archivo cuando sólo se conoce parte de su nombre. Por ejemplo, se puede utilizar el comodín * para listar todos los archivos del directorio actual con la extensión deb:

$ ls *.deb

El shell proporciona tres comodines para nombres de archivos: *, ? y [. ..]:

  • El asterisco identifica a una cadena de cualquier número de caracteres (incluyendo cero caracteres);
  • El signo de interrogación identifica a cualquier carácter simple; por ejemplo: .doc? identifica a cualquier nombre de archivo que conste de "doc" seguido por exactamente un carácter.
  • Los corchetes se utilizan para definir clases de caracteres que identifican a cualquiera perteneciente al conjunto que engloba. Por ejemplo: [D]oc identifica a los nombres de archivos doc o Doc.
  • Se puede indicar un rango o secuencia de caracteres entre corchetes con un -.
  • Existe una excepción importante a la declaración de que * identifique a cualquier secuencia de caracteres. No con un . (punto) al comienzo de un nombre archivo. Para identificar un nombre de archivo que comienza con. (punto), hay que incluir un punto en el patrón. La necesidad de indicar explícitamente un . inicial es consistente con el hecho de que los archivos con nombres que comienzan con . son tratados como archivos ocultos, que se utilizan para mantener información necesitada por el sistema o por órdenes particulares, pero que normalmente no se necesita visualizar .

Cuando el shell procesa una orden, sustituye cualquier palabra que contenga comodines de nombres de archivos por los nombres de archivos identificados. Si no existen nombres de archivos que se identifiquen con el patrón especificado, el shell no realiza ninguna sustitución.

LA ENTRADA Y SALIDA ESTÁNDAR (STDIN Y STDOUT).

Una de las características del Sistema UNIX es la forma general y flexible de tratar los archivos y la facilidad con la que se puede controlar el lugar desde donde los programas obtienen la entrada y envían la salida. La salida de una orden puede enviarse a la pantalla, almacenarse en un archivo o utilizarse como entrada a otra orden. Análogamente, la mayor parte de las órdenes aceptan entrada desde teclado, desde un archivo almacenado o desde la salida de otra orden. La orden no necesita saber de dónde viene la entrada o a dónde va la salida. Es el shell el que establece estas conexiones. En el mundo de la programación para UNIX/LINUX se suele decir "En UNIX todas las operaciones I/O se gestionan como manejo de ficheros".

Una de las funciones más importantes del shell consiste en gestionar la entrada y salida estándar, de manera que sólo se necesite especificar de dónde obtiene el comando la entrada ya dónde debe enviar la salida. Esto se realiza mediante el mecanismo de redirección de entrada y salida

REDIRECCIONES

Los siguientes símbolos se utilizan para decir al shell dónde obtener la entrada y adónde enviar la salida. Estos símbolos se conocen como operadores de redirección del shell.

  • < La entrada del comando será el fichero que se proporciona como parámetro, no un valor introducido por teclado. Ejemplo: cmd < nombreFichero
  • > La salida del comando se envía al fichero no a pantalla. Si el fichero no existe se crea, si existe machaca el contenido. Ejemplo: cmd > log.txt
  • » Similar al anterior, pero si el fichero al que se quiere redirigir la salida estándar existe no lo machaca, sino que añade la salida al final del mismo.
  • | Operador de redirección pipe (también conocido como "tubería" o "cauce"). Envía la salida de un comando como entrada del segundo comando. Ejemplo: ps | grep java.

VARIABLES DE SHELL O DE ENTORNO.

El shell dispone de un mecanismo para definir variables que se utilizan para almacenar información utilizada por los programas del sistema o por el usuario. Las variables del shell se pueden utilizar para personalizar o particularizar la información relativa a nombres de directorios y de archivos que necesitan los programas y para personalizar la forma en la que los programas (incluyendo el propio shell) interactúan con el usuario. Los programas del sistema operativo o de usuario pueden acceder a la información de estas variables de shell, motivo por el que también son conocidas como variables de entorno.

VARIABLES COMUNES DEL SHELL

A continuación se muestran algunas de las variables del shell más comunes, incluyendo aquellas que fija automáticamente el sistema.

  • HOME contiene el nombre de camino absoluto del directorio de recepción. HOME es definida automáticamente. El propio shell utiliza esta información para determinar el directorio al que cambiar cuando se teclea la orden cd sin argumento.
  • PATH lista, en orden, los directorios en los que el shell busca para encontrar el programa a ejecutar cuando se teclea una orden. PATH contiene una lista de nombres de directorios, separados por dos puntos. Un PATH por defecto es puesto por el sistema, pero la mayor parte de los usuarios lo modifican para añadir directorios de órdenes adicionales. Un campo vacío en la cadena PATH significa buscar en el directorio actual (un campo vacío es aquel con dos puntos, pero sin nombre de directorio).
  • CDPATH es similar a PATH. Lista en orden los directorios en los que busca el shell para encontrar un subdirectorio a cambiar cuando se utiliza la orden cd. Los directorios que busca el shell se listan de la misma forma que los directorios de su PATH.
  • PSl y PS2 definen los signos de sus peticiones de orden primaria y secundaria, respectivamente. Sus valores por defecto son $ para PSl y > para PS2.
  • LOGNAME contiene su nombre de presentación. Lo fija automáticamente el sistema.
  • MAIL contiene el nombre del directorio en el que se coloca el correo nuevo. El shell utiliza esta variable para notificar cuándo se añade nueva información en su directorio.
  • MAILFILE se utiliza para saber dónde colocar el nuevo correo.
  • SHELL contiene el nombre de su programa de shell. Es utilizado por el editor vi y por otras órdenes interactivas para determinar qué programa de shell ejecutar cuando se trabaja en modo control.
  • TERM es utilizada por vi y otros programas orientados a pantalla para obtener información sobre el tipo de terminal que se está utilizando. Esta información es necesaria para permitir a los programas que comparen su salida con las capacidades del terminal y para interpretar su entrada correctamente.

OBTENCIÓN DEL VALOR DE UNA VARIABLE DE SHELL

Además de fijar valores, a veces se necesita obtener el valor de una variable del shell. Para obtener el valor de una variable del shell, se precede el nombre de la variable con un signo dólar, $. Cuando el shell lee una línea de orden, interpreta cualquier palabra que comienza con $ como una variable y la sustituye con el valor de la variable.
Para ver el valor de una variable, puede utilizar la orden echo. Esta orden produce eco (imprime) de la entrada estándar en su salida estándar.Se puede utilizar la orden set para ver todas las variables actuales del shell y sus valores.

DEFINICIÓN DE LAS VARIABLES DEL SHELL

Aunque HOME, PS1, PS2 y otras variables comunes son fijadas automáticamente por el sistema, a otras no les ocurre esto y se pueden definir sus valores. TERM y MAILFILE son ejemplos de variables del shell que no se definen automáticamente.

Una variable del shell se define escribiendo su nombre seguido por un signo = y su valor. Para poner la variable de terminal a vt100, se utiliza la orden:

$ TERM=vtlOO

Siempre que se le dan valores a las variables no deben existir espacios entre el nombre de la variable, el signo = y el valor. El valor puede contener un espacio o incluso uno o más saltos de línea,pero si los contiene, debe ir entre comillas. Para eliminar una variable se utiliza la orden unset.
Cuando el shell lee una línea de orden, sustituye cualquier palabra que comience con un $ con el valor de la variable que tiene ese nombre. Se pueden visualizar sus variables de entorno con la orden: env.
Algunas de las variables definidas por el sistema son incluidas automáticamente en el entorno, y por tanto accesibles desde la shell. Pero para ponerlas a disposición de otras órdenes diferentes de las del propio shell deben ser exportadas. Algunas de las variables estándar descritas anteriormente se exportan automáticamente al entorno. Pero otras, incluyendo cualquier variable que defina el usuario y cualquier valor de una variable estándar que se cambie, no. Se utiliza la orden export para hacer que el valor de una variable esté disponible a otros programas.

LA SHELL C (CSH).

La shell C una sintaxis diferente, a veces parecida a la del lenguaje de programación C, y en la mayoría de los sistemas UNIX se encuentra como /bin/csh. Existen algunas diferencias básicas en la sintaxis del lenguaje de script definido por la shell C con respecto a la shell Bourne, además de diferencias en los comandos

Presentación e iniciación.

Cuando se inicia la shell Bourne (sh), lee del archivo .profile órdenes iniciales y definiciones de variables. El shell C sigue un procedimiento similar, pero utiliza dos archivos, denominados .cshrc y .login.

csh lee .login sólo cuando el usuario inicia sesión. El archivo .login deberá contener órdenes y definiciones de variables que sólo necesitan ser ejecutadas al comienzo de la sesión. El archivo. cshrc es un archivo de iniciación. La "rc" significa "read commands" (órdenes de lectura). La diferencia entre .cshrc y .login es que el csh lee .login sólo en la presentación, pero lee .cshrc tanto al comienzo de una sesión como cuando se le invoca desde el shell de presentación -por ejemplo, cuando se ejecuta un guión de shell-. El archivo .cshrc incluye órdenes y definiciones que se necesitan ejecutar cada vez que entra en un shell, no sólo al principio. .cshrc debería incluir las definiciones de variables que utiliza el shell pero que no son variables de entorno. Las variables de entorno deben definirse en. Login.

Variables del shell C.

El shell C dispone de variables, incluyendo variables estándar definidas por el sistema y variables definidas por el usuario. Las principales diferencias entre el shell C y el shell estándar Bourne son:

  • para definir una variable en csh se utiliza la orden set.
  • csh permite espacios entre el nombre de la variable, el signo = y el valor; sh no.
  • csh utiliza letras minúsculas para las variables ordinarias; la práctica usual en sh es utilizar letras mayúsculas.

Variables especiales del shell C.

El shell C utiliza un número de variables especiales. Algunas de ellas son directamente equivalentes a las variables de sh. Cabe destacar:

  • cwd mantiene el nombre completo del directorio de trabajo actual. Proporciona la información que utiliza la orden pwd para visualizar su directorio actual.
  • home es el nombre de camino completo de su directorio de presentación. Corresponde a la variable HOME utilizada en sh y ksh.
  • path mantiene la lista de directorios en los que busca el shell C para encontrar un programa cuando ejecuta sus órdenes. Corresponde a PATH.
  • cdpath es la variable del shell C equivalente a la variable CDPATH del shell del Sistema V.
  • prompt es la equivalente a PSl del shell del Sistema v. El valor por defecto de la petición de orden (prompt) del shell C es %, o a veces system%, donde system es el nombre de su sistema UNIX.

Variables multievaluadas

El shell C utiliza paréntesis para agrupar distintas palabras que representan distintos valores de una variable. Esto permite definir y utilizar las variables del shell C como arrays.

Variables de conmutación para activar características del shell C.

El shell C utiliza variables especiales denominadas de conmutación para activar o desactivar ciertas características. Las variables de conmutación son variables que tienen sólo dos valores: activas y desactivas. Cuando se define con la orden set una variable de conmutación, activa la correspondiente característica. Para desactivarla se utiliza unset. Variables de conmutación importantes son noclobber, ignoreeof y notify:

  • noclobber impide sobrescribir un archivo existente cuando se redirige la salida desde una orden. Se puede indicar explícitamente a csh que realmente quiere sobrescribir el archivo, colocando un signo de exclamación después del símbolo de redirección:
% ls -1 >! temp
  • ignoreeof impide que accidentalmente se salga de la sesión tecleando CTRL-D. Sin ignoreeof, un CTRL-D al comienzo de una línea de orden termina su shell y sale del sistema. Si activa ignoreeof, el shell ignora CTRL-D.
  • notify informa de cuándo termina un trabajo en modo subordinado. Si la variable notify está activa, el shell visualizará un mensaje de finalización del trabajo cuando termine la ejecución un trabajo en modo subordinado. Esta variable se puede desactivar (está activa por defecto) para no recibir mensajes de notificación al final de cada tarea en segundo plano.

Variables de entorno en C-SHELL.

Una variable de entorno es una variable que está disponible a las órdenes como parte del entorno que mantiene el shell. lLa shell Bourne (sh) define variables de entorno de la misma forma que las otras variables y utiliza export para incluir una variable en el entorno. El shell C no utiliza la orden export para colocar una variable en el entorno. En lugar de ello, utiliza una orden especial, setenv, para definir variables que son parte del entorno. Para definir variables de entorno no existe signo = entre el nombre de la variable y su valor.

setenv term vt100.

El comando env permite listar todas las variables de entorno. Para eliminar una variable de entorno se utiliza unsetenv.

Historia de órdenes.

El shell C mantiene un registro o lista de todas las órdenes que se introdujeron durante una sesión. Esto es de utilidad para buscar comandos introducidos con anterioridad. Esto lo permite el comando history
.

Alias.

La shell C permite definir alias de órdenes simples. Un alias de una orden es una palabra (el alias) y algún texto que es sustituido por el shell cuando la palabra se utiliza como orden. Se pueden utilizar alias para incluir automáticamente opciones particulares cuando se ejecuta una orden y para dar nombres cortos a comandos que se emplean con frecuencia.

Abreviatura de directorios de presentación (directorios home).

El shell C proporciona una forma fácil de abreviar el nombre de camino del directorio de recepción que es utilizando el símbolo tilde (~) al comienzo de una palabra en la línea de orden. Esto hace que el shell la sustituye con el nombre completo de camino del directorio de recepción. Por ejemplo, rm -/newfile es la forma abreviada de teclear rnv $home/newfile

Redirección del error estándar en el shell C.

csh proporciona una forma para redirigir tanto la salida estándar como el error estándar al mismo archivo. Por ejemplo:

$ find .-type f -print >& output-file & # C shell

ejecuta find en el modo subordinado y envía la salida estándar y los mensajes de error a output-file. Sin embargo, el shell C no permite que se redirija el error estándar independientemente de la salida estándar.

Terminación del nombre de archivo.

Si se activa la variable de conmutación filec del shell C, al teclear la primera letra o letras de un nombre de archivo y después teclear CTRL-D, csh expandirá el nombre parcial para hacerlo coincidir con un nombre de archivo del directorio actual.

LA SHELL KORN (KSH).

El shell Korn es una extensión de la shell de Bourne, que a su vez incorpora también la mayor parte de las novedades introducidas por la shell C, entre ellas un historial de comandos introducidos. Los programas de shell escritos para sh corren generalmente sin modificación bajo ksh. La principal ventaja de la shell Korn frente a la shell de Bourne radica en su uso como lenguaje de programación: de forma gradual a lo largo de sus diferentes versiones ha ido incorporando características de los lenguajes de programación no disponibles en sh como la posibilidad de trabajar con arrays, aritmética de punto flotante, etc. La shell de Korn, licenciada bajo un modelo propietario por AT&T hasta el año 2005, fue liberada bajo una licencia libre en el año 2005 (licencia CPL o de dominio público).

Seguidamente repasamos sus principales características, en analogía con el resto de shells.

Presentación e inicio de Shell.

Como el shell C, el shell Korn utiliza dos archivos de iniciación -uno sólo para la presentación, el otro cada vez que se ejecuta ksh. De la misma forma que sh, ksh lee el archivo .profile para buscar las órdenes que se quieren ejecutar en inicia de sesión y las variables y valores que se requiere que estén activas a lo largo de la sesión. Además de leer el .profile, cada vez que inicializa ksh también lee un archivo de entorno. El archivo de entorno es análogo al archivo .cshrc del shell C. A diferencia de csh, ksh no supone que este archivo tiene un nombre o posición particular. El nombre y posición se definen con la variable ENV, de .profile.

Variables del shell Korn.

El shell Korn implementa todas las características del shell estándar relacionadas con variables e incluye todas las variables del shell estándar. Se pueden defInir o redefinir variables, exportarlas al entorno y obtener sus valores. El shell Korn utiliza algunas de las variables del shell de Bourne (sh), entre las que se encuentran: CDPATH, HOME, LOGNAME, MAIL, MAILCHECK, MAILPATH, PATH, PSI, PS2, SHELL y TERM.

Algunas variables utilizadas por el shell Korn que no se utilizan en sh son:

  • ENV dice a ksh dónde encontrar el archivo de entorno que se lee en la iniciación.
  • HISTSIZE dice a ksh cuántas órdenes guardar en el archivo de historia
  • TMOUT dice a ksh cuántos segundos esperar antes de producirse un timeout.
  • Para ver las variables de shell actuales y sus valores se utiliza la orden set.

Historia de órdenes.

El shell Kom mantiene una historia de las órdenes que se van introduciendo al trabajar en una sesión. Para ver las últimas órdenes que se introdujeron tecleando history. El número de líneas de órdenes que mantiene ksh viene controlado por la variable del shell HISTSIZE.

Alias.

De la misma forma que el shell C, el shell Kom permite definir alias de órdenes simples. Los alias se definen en el shell Kom de la misma forma que se definen las variables. En particular, como ocurre con las variables del shell, no deben existir espacios entre el nombre del alias, el signo = y su valor. También, si el valor incluye espacios (por ejemplo, un nombre de orden y opciones), deben ir entre comillas.

Abreviatura de los directorios de presentación.

El shell Kom proporciona una forma fácil para abreviar los nombres de caminos de los directorios de trabajo usando el símbolo tilde ~.

LA SHELL BASH (BOURNE AGAIN SHELL).

BASH un acrónimo de bourne-again shell, tratándose de un programa de shell bajo licencia de software libre distribuída en la versión de UNIX GNU. GNU es un proyecto impulsado por Richard Stallman para construir un sistema operativo plenamente compatible con UNIX, pero distribuido bajo un modelo de licencia libre. Para distribuir GNU con una licencia que garantizase las libertades que Stallman postulaba que debía tener el software, diseño la licencia GNU, licencia que se ha hecho más celebro que el propio producto que se deseaba licenciar. Brian Fox escribió el intérprete bash en 1987. En 1990, Chet Ramey se convirtió en su principal desarrollador. bash es el intérprete predeterminado en la mayoría de sistemas GNU/Linux, además de Mac OS X Tiger, y puede ejecutarse en la mayoría de los sistemas operativos tipo Unix. También ha sido portado para que pueda funcionar en Microsoft Windows a través del proyecto Cygwin.

La mayoría de los shell scripts (guiones de órdenes) Bourne pueden ejecutarse por bash sin ningún cambio, con la excepción de aquellos scripts de shell Bourne que hacen referencia a variables especiales de Bourne o que utilizan una orden interna de Bourne. La sintaxis de órdenes de bash incluye ideas tomadas desde el Korn Shell (ksh) y el C Shell (csh), como la edición de la línea de órdenes, el historial de órdenes, la pila de directorios, las variables $RANDOM y $PPID, y la sintaxis de substitución de órdenes POSIX: $(…). Cuando se utiliza como un intérprete de órdenes interactivo, bash proporciona autocompletado de nombres de programas, nombres de archivos, nombres de variables, etc, cuando el usuario pulsa la tecla TAB. Seguidamente repasamos alguna de las nuevas características del shell bash.

Presentación e inicio de shell.

Cuando bash arranca, ejecuta las órdenes que se encuentran en diferentes scripts. Cuando se invoca a bash como un shell interactivo para el inicio de una sesión (login shell), o como un shell no interactivo con la opción —login, en primer lugar lee y ejecuta órdenes desde el archivo /etc/profile, si existe. Después, busca ~/.bash_profile, ~/.bash_login, y ~/.profile, en este orden, y lee y ejecuta las órdenes desde el primero que existe y es legible. La opción —noprofile puede utilizarse al comenzar un nuevo shell para inhibir este comportamiento.
Cuando un login shell termina, bash lee y ejecuta las órdenes de ~/.bash_logout, si existe. Cuando un shell interactivo que no es un login shell arranca, bash lee y ejecuta órdenes desde ~/.bashrc, si existiese. Esto puede evitarse utilizando la opción —norc. La opción —rcfile archivo forzará a bash a leer y ejecutar órdenes desde archivo en lugar de ~/.bashrc.

Cuando bash arranca de un modo no interactivo, por ejemplo para ejecutar un shell script diferente, busca la variable de entorno BASH_ENV, si existe expande su valor, y lo utiliza como el nombre del archivo para leer y ejecutar.

Si se invoca a bash con el nombre sh, intenta replicar el comportamiento de las versiones antiguas de sh, a la vez que se mantiene la conformidad con el estándar POSIX. Cuando se invoca como un login shell interactivo, o un shell no interactivo con la opción —login, primero intenta leer y ejecutar órdenes desde /etc/profile y ~/.profile, en este orden. La opción —noprofile puede utilizarse para evitar este comportamiento.

Cuando se invoca como un shell interactivo con el nombre sh, bash busca la variable ENV, si está definida expande su valor, y utiliza el valor expandido como el nombre de un archivo para leer y ejecutar. Como un shell invocado como sh no intenta leer y ejecutar órdenes desde ningún otro archivo de arranque, y la opción —rcfile no tiene efecto. Un shell no interactivo invocado con el nombre sh no intenta leer ningún otro archivo de arranque. Cuando se invoca como sh, bash entra en el modo posix después de leer los archivos de inicio.

Cuando se inicia bash en el modo posix, por ejemplo con la opción —posix, sigue el estándar POSIX para los archivos de incio. En este modo, los shells interactivos expanden la variable ENV y se leen, y ejecutan, las órdenes desde el archivo cuyo nombre es el valor de la variable expandida. No se lee ningún otro archivo de arranque.

bash intenta determinar cuando está siendo ejecutado por un demonio de shell remoto, normalmente rshd. Si bash determina que está siendo ejecutado por rshd, lee y ejecuta órdenes desde ~/.bashrc, si este archivo existe y es legible. No hará esto si se invoca como sh. La opción —norc puede utilizarse para evitar este comportamiento, y la opción —rcfile puede utilizarse para forzar a leer otro archivo, pero rshd normalmente no invoca al shell con estas opciones o permite que sean especificadas.

Acceso a los parámetros

Los scripts de bash reciben los parámetros que le pasa la shell como $1, $2, …, $n. Podemos saber cuantos hemos recibido con el símbolo $#. Por ejemplo, si nuestro script necesita dos parámetros pondremos:

if [ $# -lt 2 ]; then
   echo "Necesitas pasar dos parámetros."
   exit 1
 fi

Aritmética entera.

Una gran limitación del intérprete Bourne es que no puede realizar cálculos con enteros sin lanzar un proceso externo. En cambio, un proceso bash puede realizar cálculos con enteros utilizando la orden ((…)) y la sintaxis de variables $[…] de la siguiente manera:

VAR=55             # Asigna el valor entero 55 a la variable VAR.
 ((VAR = VAR + 1))  # Suma uno a la variable VAR.  Observe la ausencia del carácter '$'.
 ((++VAR))          # Otra forma de sumar uno a VAR.  Preincremento estilo C.
 ((VAR++))          # Otra forma de sumar uno a VAR.  Postincremento estilo C.
 echo $[VAR * 22]   # Multiplica la variable VAR por 22 y substituye la orden por el resultado.
 echo $((VAR * 22)) # Otra forma de realizar lo mismo.

La orden ((…)) también se puede utilizar en sentencias condicionales, ya que su código de retorno es 0 o 1 dependiendo de si la condición es cierta o falsa:

if ((VAR == Y * 3 + X * 2))
 then
         echo Si
 fi
 ((Z > 23)) && echo Si

La orden ((…)) soporta los siguientes operadores relacionales: '==', '!=', '>', '<', '>=', y '<='.

Un proceso bash no puede realizar cálculos en coma flotante. Los únicos shell Unix capaces de esto son el Korn Shell (versión de 1993) y el zsh (a partir de la versión 4.0).

Redirecciones de Entrada/Salida

La sintaxis de bash permite diferentes formas de redirección de entrada/salida de las que el Shell Bourne tradicional carece. bash puede redirigir la salida estándar y los flujos de error estándar a la vez utilizando la sintaxis:

orden &> archivo

que es más simple que teclear la orden Bourne equivalente,
orden > archivo 2>&1

Expresiones regulares

Los procesos bash 3.0 soportan emparejamiento de expresiones regulares utilizando la siguiente sintaxis, reminiscente de Perl:

[[ string =~ regex ]]

El estado de salida de la orden anterior es 0 si la cadena concuerda con la expresión regular, y 1 si no casan. En las expresiones regulares puede accederse a las partes delimitadas por paréntesis, utilizando la variable shell BASH_REMATCH, de la siguiente manera:

if [[ foobarbletch =~ 'foo(bar)bl(.*)' ]]
 then
         echo The regex matches!
         echo $BASH_REMATCH      -- outputs: foobarbletch
         echo ${BASH_REMATCH[1]} -- outputs: bar
         echo ${BASH_REMATCH[2]} -- outputs: etch
 fi

OTRAS SHELLS.

  • La shell Almquist (ash). Shell bajo licencia BSD concebida para sustituir a la shell estándar de Bourne. Suele ser utilizada en sistemas empotrados o con recursos limitados. Las shells de sistemas UNIX como FreeBSD o NetBSD están basados en la shell ash, con una serie de cambios para conseguir la conformidad con el estándar POSIX.
  • Debian Almquist shell (dash). Shell de Debian basada en la shell ash.
  • La shell TENEX C (tcsh). Extensión de la shell C.
  • La shell Z (zsh). Es una de las shells que más características tiene, al tratar de incluir características de sh, ash, bash, csh, ksh y tcsh.

REFERENCIAS EXTERNAS.

Documentación original de la shell de Bourne (1978)
Sitio oficial de la shell Korn
Proyecto GNU
La shell BASH
Introducción a la shell C por su creador, William Joy

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License