.. include:: ../../my-header_2.txt

El *Shell* es un programa
--------------------------------

Es *shell* es un programa qué básicamente ejecuta otros programas. Más adelante en el desarrollo del proyecto, tú mismo construirás un pequeño *shell*. El *shell* se ejecuta automáticamente al abrir el *terminal* en la interfaz gráfica, pero puedes ejecutarlo directamente en cualquier momento. Prueba a hacer:: 

  bash

Y, de hecho, cuando ejecutas un *shell script* como ``crea_mi_entorno`` el propio *shell* ejecuta un *shell* para interpretar el *shell script*. 

En resumen, un *shell* de Linux como ``bash`` es un programa capaz de ejecutar programas que están en ficheros con *formato ejecutable* (esto significa que contiene código máquina, pero también que está organizado de acuerdo a una estructura determinada por ese formato) mediante la interpretación de órdenes en texto, incluyendo estructuras de control como ``for`` o ``if``. 

Como programadores quisiéramos conocer cuándo nos interesaría programar nuestra herramienta en el lenguaje del *shell*, interpretada, y cuándo en C, compilada, o si conviene una solución mixta. Por supuesto, la experiencia es fundamental para poder tomar la decisión adecuada en cada momento, pero fundamentalmente hay que tener en cuenta los siguientes hechos:

* Las herramientas que podemos usar en un programa C (secciones 2 y 3 del ``man``) son más variadas y permiten una utilización más personalizada que las del *shell*.

* La flexibilidad en la programación (tipos de datos, control de flujo, etc) que ofrece el *shell* es menor que la de un lenguaje como C. 

* Un programa C siempre será más eficiente, ya que se carga y ejecuta de una vez. Un *shell script* tiene que ser *interpretado* por el *shell* y el sistema tiene que manejar la carga de los programas en cada paso.

* Muchas de las órdenes que habitualmente manejamos con el *shell* no son programas sino *funciones internas* del *shell*, lo que significa que el *shell* no tiene que cargar código para ejecutarlas. Echa un vistazo en el ``man`` del ``bash``, en el apartado "BUILTIN COMMANDS".

* No hay un lenguaje *shell*, sino muchos, y en general no compatibles entre ellos. Es decir, un *shell script* está ligado no solo al sistema operativo, sino al *shell* concreto, lo que plantea mayores restricciones en cuanto a la compatibilidad.

* El *shell* permite *componer* programas con gran agilidad. Esto lo entenderás mucho mejor cuando llegues a la Parte 2 del curso.

.. include:: ../../my-footer_2.txt
