Introducción

El shell es un intérprete de comandos. Más que la capa aislante entre el kernel del sistema operativo y el usuario, también es un lenguaje de programación bastante poderoso. Un programa shell, llamado script , es una herramienta fácil de usar para crear aplicaciones al "pegarlas juntas"Sistema de llamadas, herramientas, utilidades y binarios compilados. Prácticamente todo el repertorio de comandos, utilidades y herramientas de UNIX está disponible para ser invocado por un script de shell. Si eso no fuera suficiente, los comandos internos del shell, como las pruebas y las construcciones de bucle, otorgan poder y flexibilidad adicionales a los scripts. Los scripts de shell son especialmente adecuados para tareas administrativas del sistema y otras tareas repetitivas de rutina que no requieren las campanas y los silbidos de un lenguaje de programación totalmente estructurado.

Programación de shell

Un conocimiento práctico de los scripts de shell es esencial para cualquier persona que desee ser razonablemente competente en la administración del sistema, incluso si no anticipa tener que escribir un script. Tenga en cuenta que a medida que se inicia una máquina Linux, ejecuta los scripts de shell en /etc/rc.d para restaurar la configuración del sistema y configurar los servicios. Una comprensión detallada de estos scripts de inicio es importante para analizar el comportamiento de un sistema y, posiblemente, para modificarlo.

El oficio de secuencias de comandos no es difícil de dominar, ya que los scripts se pueden construir en secciones tamaño de un bocado y sólo hay un bastante pequeño conjunto de operadores y opciones de shell específica para aprender.

La sintaxis es simple, incluso austera, similar a la de invocar y encadenar utilidades en la línea de comando, y solo hay unas pocas "reglas" que rigen su uso. La mayoría de los scripts cortos funcionan correctamente la primera vez, y depurar incluso los más largos es sencillo.

En los primeros días de la computación personal, el lenguaje BASIC permitía a cualquier persona con conocimientos razonables de computadoras escribir programas en una generación temprana de microcomputadoras.

Décadas más tarde, el lenguaje de scripts Bash permite que cualquier persona con un conocimiento rudimentario de Linux o UNIX haga lo mismo en las máquinas modernas. Ahora contamos con computadoras miniaturizadas de una sola placa con capacidades sorprendentes , como la Raspberry Pi . Bash scripting proporciona una forma de explorar las capacidades de estos dispositivos fascinantes.

Un script de shell es un método rápido y sucio de crear prototipos de una aplicación compleja. Obtener incluso un subconjunto limitado de la funcionalidad para trabajar en un script es a menudo una primera etapa útil en el desarrollo de proyectos. De esta manera, la estructura de la aplicación se puede probar y manipular, y las principales dificultades encontradas antes de proceder a la codificación final en C , C ++ , Java , Perl o Python .

Shell scripting recuerda la clásica filosofía de UNIX de dividir proyectos complejos en subtareas más simples, de encadenar componentes y utilidades. Muchos consideran que este es un enfoque mejor, o al menos más estéticamente agradable, para la resolución de problemas que el uso de uno de la nueva generación de lenguajes todo en uno de gran potencia, como Perl , que intentan ser todo para todos, pero en general el costo de forzarlo a modificar sus procesos de pensamiento para que se ajusten a la herramienta. Según Herbert Mayer , "un lenguaje útil necesita matrices, indicadores y un mecanismo genérico para construir estructuras de datos". Según estos criterios, el shell scripting no es "útil". O, quizás no. . . .

Cuando no usar scripts de shell

  • Tareas de uso intensivo de recursos, especialmente donde la velocidad es un factor (clasificación, hash, recursión [2] ...)
  • Procedimientos que involucran operaciones matemáticas de alto rendimiento, especialmente aritmética de punto flotante, cálculos de precisión arbitrarios o números complejos (use C ++ o FORTRAN en su lugar) 
  • Requiere portabilidad multiplataforma (use C o Java en su lugar)
  • Aplicaciones complejas, donde la programación estructurada es una necesidad (verificación de tipo de variables, prototipos de funciones, etc.) 
  • Aplicaciones críticas para la misión a las que apuesta el futuro de la empresa.
  • Situaciones en las que la seguridad es importante, donde debe garantizar la integridad de su sistema y protegerse contra intrusiones, grietas y vandalismo.
  • El proyecto consta de subcomponentes con dependencias entrelazadas
  • Se requieren extensas operaciones de archivos ( Bash está limitado al acceso a archivos en serie, y eso solo en una línea por línea particularmente torpe e ineficiente).
  • Necesita soporte nativo para arreglos multidimensionales
  • Necesita estructuras de datos, como listas enlazadas o árboles
  • Necesidad de generar / manipular gráficos o GUIs
  • Necesita acceso directo al hardware del sistema o periféricos externos
  • Necesito puerto o socket I / O
  • Necesidad de usar bibliotecas o interfaz con código heredado
  • Aplicaciones propietarias de código cerrado (los scripts de Shell ponen el código fuente a la vista de todo el mundo).
Si se aplica alguna de las situaciones anteriores, considere un lenguaje de scripting más potente, tal vez Perl , Tcl , Python , Ruby , o posiblemente un lenguaje compilado como C , C ++ o Java . Incluso entonces, crear un prototipo de la aplicación como un script de shell podría ser un paso de desarrollo útil.

Usaremos Bash , un acrónimo para "Bourne-Again shell" y un juego de palabras en la ya clásica Bourne shell de Stephen Bourne. Bash se ha convertido en un estándar de facto para shell scripting en la mayoría de las versiones de UNIX.

La mayoría de los principios que cubre este libro se aplican igualmente a los scripts con otros shells, como el Korn Shell , del cual Bash deriva algunas de sus características, y el C Shell y sus variantes. (Tenga en cuenta que la programación de Shell C no se recomienda debido a ciertos problemas inherentes, como se señaló en octubre de 1993 Usenet post por Tom Christiansen.)

Lo que sigue es un tutorial sobre shell scripting. Se basa en gran medida en ejemplos para ilustrar varias características de la shell. Los scripts de ejemplo funcionan (se han probado, en la medida de lo posible) y algunos de ellos incluso son útiles en la vida real.

El lector puede jugar con el código de trabajo real de los ejemplos en el archivo fuente ( scriptname.sh o scriptname.bash ), darles permiso de ejecución ( chmod u + rx scriptname ) y luego ejecutarlos para ver qué sucede.