Programación en Shell

Ejecución y agrupación de órdenes

Una vez vistas gran parte de las órdenes de usuario, pasamos a ver una de las principales características de un sistema Unix que es la facilidad para agrupar órdenes de distintas formas para realizar tareas complejas. Por un lado en la propia línea de órdenes se pueden especificar órdenes y unir su ejecución de diversas formas.

Hasta ahora hemos visto como combinar órdenes con tubería, como redirigir las salida y como gestionar procesos en primer y segundo planos. Ahora vamos a ver otra serie de mecanismos para ejecutar órdenes y programas y verificar el estado de conclusión de la orden.

Código de terminación de una orden

Cuando una orden termina le devuelve al sistema un código de finalización, un valor cero en caso de terminar correctamente o un valor uno si se ha producido un error. Este valor se almacena en la variable $?.

Por ejemplo

[pfabrega@port /home]$ ls -la /home
total 32
drwxr-xr-x    5 root     root         4096 sep 20 14:16 .
drwxr-xr-x   18 root     root         4096 sep 20 03:23 ..
drwxr-xr-x    4 root     root         4096 sep 28 21:16 httpd
drwxr-xr-x    2 root     root        16384 sep 19 18:25 lost+found
drwx--x--x   20 pfabrega pfabrega     4096 nov 24 19:07 pfabrega
[pfabrega@port /home]$ echo $?
0
[pfabrega@port /home]$ ls -la asdfg
ls: asdfg: No existe el fichero o el directorio
[pfabrega@port /home]$ echo $?
1
[pfabrega@port /home]$

Podemos observar como en la primera ejecución ls -la devuelve un valor 0 de terminación correcta y en la segunda devuelve un error y n código 1.

Ejecución consecutiva

Podemos agrupar varias órdenes en una misma línea de ordenes separándolas por ";"

La agrupación de órdenes separadas por ";" es útil cuando tenemos que repetir una misma secuencia de órdenes varias veces.

La ejecución de cada una de las órdenes se realiza cuando ha concluido la anterior, e independiente de que el resultado haya sido correcto o no.

Esto nos puede resultar útil para demorar la ejecución de una o varias órdenes un determinado tiempo, por ejemplo

$ sleep 300 ; ps axu

y la orden ps axu se ejecutaría a los 300 segundos.

Ejecución condicional

Otra situación algo más elaborada que la anterior es ejecutar una orden condicionada a la terminación correcta o no de una orden previa.

Esta funcionalidad nos la proporcionan los operadores "&&" y "||".

Operador &&

El primer operador, "&& " separa dos órdenes de forma que la que tiene a la derecha sólo se ejecuta cuando la de la izquierda termina correctamente, es decir

orden1 && orden2

orden2 sólo se ejecutará si orden1 terminó sin ningún error.

Por ejemplo, queremos ejecutar la orden cat fichero sólo si existe fichero; entonces tendremos que buscar una orden que termine con un error si no existe fichero, por ejemplo ls fichero y condicionar la ejecución de cat fichero a esta:

$ ls fichero && cat fichero

Otro ejemplo, para compilar los controladores de dispositivos de linux e instalarlos, lo podemos hacer como:

make module && make modules_install

es decir instalará los controladores sólo si ha conseguido compilarlos correctamente.