Fundamentos de Linux y scripting en bash


Introducción

Linux® es un sistema operativo de código abierto. Originalmente fue concebido y creado como un pasatiempo por Linus Torvalds en 1991. Linus, mientras estaba en la universidad de Helsinki, buscó crear una versión alternativa, gratuita y de código abierto del sistema operativo Minix, que a su vez se basaba en los principios y el diseño de Unix. Desde entonces, ese pasatiempo se ha convertido en el sistema operativo con la base de usuarios más grande, el sistema operativo más utilizado en los servidores de Internet disponibles públicamente y el único sistema operativo utilizado en las 450 supercomputadoras más rápidas. Quizás lo mejor de Linux es que es de código abierto.

Linux se publica bajo la Licencia Pública General GNU (GPL). Eso significa que cualquiera puede ejecutar, estudiar, compartir y modificar el software. El código modificado también se puede redistribuir e incluso vender, pero debe hacerse bajo la misma licencia. Esto difiere mucho de los sistemas operativos tradicionales —Unix y Windows, por ejemplo— que son propietarios, están bloqueados y se entregan tal cual y no se pueden modificar.

Como parte de su ascenso a la prominencia, el aumento de la complejidad, el alcance y el número de contribuyentes del proyecto, el proyecto del núcleo requería la infraestructura tecnológica, administrativa y legal necesaria para escalar con la comunidad. Como resultado, la Fundación Linux se creó en el año 2000 como el Laboratorio de desarrollo de código abierto (que posteriormente cambió su nombre por el de Fundación Linux).

Hoy en día, Linux es un líder indiscutible de la industria, pero debes recordar que no siempre fue así. En el momento de la creación de la fundación, Linux ocupaba solo una participación minoritaria en el mercado de la informática de alto rendimiento. En el año 2020 tiene un dominio completo del mercado de supercomputadoras, desplazando por completo a UNIX, que tenía el 85 por ciento de todos los sistemas de cómputo de alto rendimiento, tan solo 20 años antes.

Como resultado de los esfuerzos de las comunidades de la Fundación Linux durante las últimas dos décadas y las contribuciones de código abierto, Linux ahora ocupa una participación mayoritaria en la industria automotriz, sistemas integrados, dispositivos móviles y computación en la nube.


Explicación

Básicos sobre las distribuciones de Linux y sus usos

Una distribución de Linux (a menudo abreviada como distro) es un sistema operativo creado a partir de una colección de software que se basa en el kernel de Linux y, a menudo, en un sistema de administración de paquetes.

Los usuarios de Linux generalmente obtienen su sistema operativo descargando una de las distribuciones de Linux, que están disponibles para una amplia variedad de sistemas que van desde dispositivos integrados (por ejemplo, OpenSTLinux) y computadoras personales (por ejemplo, Ubuntu) hasta poderosas supercomputadoras (por ejemplo, Rocks Cluster). Una distribución típica de Linux comprende un kernel de Linux, herramientas y bibliotecas GNU, software adicional, documentación, un sistema de ventanas, un administrador de ventanas y un entorno de escritorio.

Como hay más de 1000 versiones de Linux conocidas a la fecha, existen varias formas de clasificarlas para darles seguimiento. Las formas usuales de clasificación son las siguientes: por manejador de paquetes, por fuente original y por grado de innovación en funcionalidades.

Los sistemas de manejo de paquetes más usuales son los siguientes:

  1. Debian (Deb)
    dpkg es el software en la base del sistema de administración de paquetes en el sistema operativo libre Debian y sus numerosos derivados .dpkg se utiliza para instalar, eliminar y proporcionar información sobre paquetes .deb.
    1. 1.1 Basados en Debian.
      1.2 Basados en MEPIS.
      1.3 Basados en KNOPPIX.
      1.4 Basados en Ubuntu.

  2. RPM
    Red Hat Linux y SUSE Linux fueron las principales distribuciones originales que usaban el formato de archivo .rpm, que se usa hoy en día en varios sistemas de administración de paquetes. Ambos se dividieron más tarde en distribuciones comerciales y respaldadas por la comunidad. Red Hat Linux se dividió en una distribución respaldada por la comunidad, pero patrocinada por Red Hat llamada Fedora, y una distribución respaldada comercialmente llamada Red Hat Enterprise Linux, mientras que SUSE se dividió en openSUSE y SUSE Linux Enterprise.
    1. 2.1 Basados en CentOS/RHEL.
      2.2 Basados en Fedora.
      2.3 Basados en openSUSE.
      2.4 Basados en urpmi.
      2.5 Basados en apt-rpm.

  3. Pacman
    Pacman es un administrador de paquetes que es capaz de resolver dependencias y descargar e instalar automáticamente todos los paquetes necesarios. Es desarrollado y utilizado principalmente por Arch Linux y sus derivados.
  4. Portage
    Gentoo es una distribución diseñada para tener un software altamente optimizado y actualizado con frecuencia. Las distribuciones basadas en Gentoo utilizan el sistema de gestión de paquetes Portage.
  5. Slackware
    A diferencia de la mayoría de las distribuciones de Linux modernas, Slackware no proporciona un procedimiento de instalación gráfico ni una resolución automática de dependencias de los paquetes de software. Usa archivos de texto sin formato y un pequeño conjunto de scripts de Shell para la configuración y administración. Arranca en un entorno de interfaz de línea de comandos.
  6. Distribuciones basadas en el código fuente
    Las distribuciones basadas en el código fuente utilizan las fuentes generadas por GNU y la fuente del kernel desarrollado por Linux Torvalds y se compilan manualmente para tener un mayor control sobre las funcionalidades que se incluyen.

Al instalar cualquier distribución de Linux es muy importante considerar el end of life (EOL) esperado para esa versión. Por ejemplo, CentOS anunció el EOL de CentOS Linux para finales de 2021 para migrar a Centos Stream, el cual tiene un EOL esperado para 2024. Las versiones de CentOS van coordinadas con Red Hat Enterprise Linux (RHEL) y son basadas en rpm.

Programación (scripting) en Shell

Cuando Linux empezó todas las órdenes eran por medio de comandos de texto de una manera nativa, con los cambios que ha tenido a través de los años los usuarios pueden encontrarse con un entorno amigable muy parecido al de Windows. Aun así, Linux sigue contando con el modo de comandos de texto en consola que se le conoce como Shell, el cual analiza los comandos y los ejecuta.



En GNU/Linux, un Shell es un programa que sirve de interfaz entre el usuario y el sistema operativo. Los tipos de Shell que hay son los siguientes:

  1. El Bourne Shell (sh), escrito por Steve Bourne en los laboratorios Bell. Es el Shell original de UNIX. Es el Shell más rápido y el que la mayoría de los usuarios prefiere. No tiene interactividad ni la habilidad de recordar instrucciones previamente utilizadas.

  2. El C Shell (csh), creado por Bill Joy de UCLA Berkley, tiene características eficientes como aliases y un historial de comandos. Se pueden preparar y anidar comandos usando una sintaxis basada en el lenguaje de programación C (Geeks For Geks, 2020).

  3. El Korn Shell (ksh), programado por David Korn de Bell Labs, es un superconjunto de las funcionalidades del Bourne Shell. Lo cual quiere decir que puede ejecutar todo lo que el Bourne Shell ejecutaría. Incluye características como aritmética, arreglos tipo C, funciones y manejo de cadenas de caracteres (strings). Es más rápido que el C-Shell.

  4. El GNU/Bourne Again Shell (bash) es compatible con el Bourne Shell e incluye algunas de las funcionalidades del Korn Shell. Las principales características del bash son edición de líneas de comandos, control de tareas, historial ilimitado de comandos, funciones y aliases y tamaño ilimitado de arreglos.

  5. El Zshell (Zsh) está diseñado para ser interactivo e incorpora muchas de las características de todos los demás Shells. Además de eso, tiene características únicas, como lo son generación de nombres de archivos, archivos de inicio, índice de conceptos, índice de variables e índice de funciones.

En esta sección hay una lista de las operaciones más comunes que se pueden realizar en el Shell de la mayoría de los sistemas operativos Linux modernos. En este caso, Z Shell para efectos demostrativos.
En un sistema operativo Linux, la interfaz de comandos con Shell se ejecuta desde una terminal. Para ejecutar la terminal/consola/shell desde CentOS hay que pulsar el menú de actividades localizado en la parte superior izquierda de la pantalla. Posteriormente, haz clic en el ícono en forma de cuadro negro con un pequeño cursor que está debajo del ícono del salvavidas.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Después de presionar el ícono, aparecerá una pantalla similar a esta:


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Cuando esto suceda teclea la instrucción uname -mrs y presiona enter.

Ahí podrás ver sistema, versión y release del sistema que estás utilizando.
Observa cómo utiliza un guion después de la instrucción. Los parámetros de Shell script son las entidades que se utilizan para almacenar variables en Shell. Un parámetro puede ser un argumento o una variable se puede llamar como parámetro, aunque no se utilice como parte de un argumento de comando. Los parámetros especiales están preestablecidos por el Shell y estos parámetros son de solo lectura. Las variables son administradas por el Shell o por los usuarios.

¿Cómo puedes saber los parámetros especiales que espera un comando en Shell? Para eso existe la instrucción man.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Esta instrucción despliega las páginas del manual de instrucciones relacionadas con el comando que se le pasa como argumento. Presiona la tecla q para salir del manual.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Los argumentos son las palabras separadas por espacio que van después de la instrucción. Observa cómo en el ejemplo usas man unamey no hay un guion enfrente de la palabra uname. Esto se debe a que uname no es un parámetro que modifica el comportamiento de la instrucción, sino que es un argumento necesario para que esta funcione.

La instrucción pwd regresa a la salida estándar (stdout), la trayectoria absoluta del directorio de trabajo actual de acuerdo con Pedamkar (s.f.).

El comando ls enlista el nombre de todos los archivos contenidos en el directorio de trabajo actual. Cuando se ejecuta sin parámetros, solo enlista el nombre de los archivos que se encuentran en la carpeta actual de trabajo. No se muestran atributos de los archivos ni el contenido de carpetas dentro del mismo.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Cuando se añade el parámetro –R la instrucción despliega un listado de los contenidos de las carpetas (subdirectorios) que están dentro del directorio actual de trabajo.

Cuando se añade el parámetro -l la instrucción despliega los permisos de acceso con los que cuenta el archivo, su creador y el grupo de archivos al que pertenece. El atributo de permisos es sumamente importante cuando trabajas con scripts, pues es lo que determina si puedes leer, escribir o ejecutar un archivo.

Los parámetros después del guion se pueden combinar para obtener un resultado que modifica la instrucción, según los parámetros que selecciones. Por ejemplo, si tecleas ls – lR se desplegarán los archivos del directorio actual de trabajo y sus subdirectorios, cada uno con los atributos correspondientes.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

En la imagen se puede apreciar que ahora el listado contiene una descripción de los permisos, el usuario que creó el archivo, el grupo de archivos a los que pertenece, la cantidad de bytes que consume el archivo en disco, la fecha y hora de última modificación y el nombre del archivo.

La instrucción cd (change directory) sirve para cambiar el directorio sobre el cual trabajas. Para acceder a un subdirectorio tecleas cd y nombre_del_subdirectorio. Si quieres regresar al directorio que está un nivel arriba, hay que teclear cd .. para hacerlo. Si sabes la ubicación exacta a la que quieres ir, teclea cd/directorio/subdirectorio/locacion_a_la_que_deseas_ir (este ejemplo asume que la ubicación a la que quieres ir es a un subdirectorio, dentro del directorio principal y, por último, a la ubicación del archivo).


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

La instrucción mkdir crea directorios en la trayectoria que se especifica como argumento a la misma.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

La instrucción rm borra archivos especificados en la trayectoria provista como argumento. Si un directorio no está vacío, no podrá ser borrado hasta que todos los archivos que contiene sean borrados también. Esta es una instrucción muy poderosa y se les sugiere estudiar a detalle el manual (man rm) para utilizarla. Es muy importante que no uses el parámetro -Rf con rm hasta que hayas leído con detalle el manual, ya que puedes borrar archivos importantes para el funcionamiento del sistema operativo.

La instrucción rmdir borra directorios de la misma manera que rm borra archivos.

Con estas instrucciones adquiriste el conocimiento suficiente para desplazarte dentro del sistema de archivos de una computadora que usa GNU/Linux como sistema operativo.

Ahora aprenderás cómo crear archivos y archivos con scripts ejecutables desde el Shell. Para empezar, necesitas conocer cómo crear un archivo. Hay muchos editores disponibles para escribir archivos en el Shell de Linux. Algunos de ellos son vi, emacs, nano, pico, joe, jed, ex, ed y ne. Durante esta experiencia utilizarás nano, pues es de los más amigables con el usuario y su curva de aprendizaje es reducida.

El primer paso es validar si nano está instalado por defecto en la versión de CentOS Linux que estás utilizando:


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.



Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Una vez instalado, puedes crear tu primer archivo de texto.
Para crear un archivo, invoca el editor de textos nano, como se muestra en la pantalla de anterior.

Una vez abierto el editor, puedes teclear el contenido que necesites agregar al archivo.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Para proseguir este ejemplo, teclea el nombre de los siguientes platillos mexicanos:

Mole
Menudo
Pozole
Tortilla
Escamole
Tlayuda
Papadzul
Cabrito

Al terminar de elaborar la lista presiona la tecla Ctrl y x al mismo tiempo.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

El programa pregunta si deseas guardar el buffer como archivo. Teclea Y como respuesta. Guarda el archivo con el nombre platillos.txt


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Al listar los contenidos del directorio con el comando ls, debe aparecer el archivo platillos.txt.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Felicidades, has creado tu primer archivo usando un Shell de Linux.

Con la instrucción cat puedes ver el contenido de un archivo que se pasa a la instrucción como un argumento.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Utiliza la instrucción cp para copiar un archivo de una trayectoria de origen a una trayectoria de destino. Por ejemplo, copia el archivo platillos.txt a otro archivo que se llame platillos2.txt.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Utiliza la instrucción mv para mover un archivo de una trayectoria de origen a una trayectoria de destino. Por ejemplo, crea el subdirectorio listas y copia ahí el archivo platillos.txt a otro archivo que se llame platillos2.txt.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

El comando grep sirve para buscar un patrón dentro de un archivo. Regresa todas las líneas donde encontró ese patrón. Para probar esto vamos a buscar todas las ocurrencias de ole en platillos.txt. Teclea la instrucción grep ole platillos2.txt. Observa cómo solo se despliegan las palabras que contienen la partícula ‘ole’. Se pueden usar expresiones regulares para buscar patrones especiales en los textos.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Geeks For Geeks (2019) provee varios ejemplos sobre cómo las expresiones regulares permiten encontrar patrones dentro de un texto de manera muy flexible.

Cuando ejecutas un comando Shell y al final añades el operador > y el nombre de un archivo, lo que ocurre es que el sistema operativo crea un archivo con ese nombre y pone dentro de este el resultado que arroja el comando de Shell. Por ejemplo, mandas el listado del contenido del directorio actual a un archivo que se llame listado.txt, ejecutando la instrucción ls > listado.txt en el directorio de trabajo actual.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Utilizando el operador | puedes hacer que una operación encadene con otra. Por ejemplo, si usas la siguiente secuencia cat platillos2.txt | grep ole > platillos_con_ole.txt, el script leerá el archivo platillos2.txt en el directorio de trabajo actual, alimentando la instrucción grep ole y arrojará el resultado en un archivo llamado platillos_con_ole.txt


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Ahora que ya conoces algunas instrucciones que se pueden usar en el Shell de Linux, aprenderás a generar scripts que automaticen tareas repetitivas en la operación diaria.

Empieza por abrir un archivo y nómbralo eventos.txt. Llénalo con la siguiente información cuidando que cada registro de venta quede en una sola línea:


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Después de hacer esto, ahora harás un script que automatice el procesamiento y separe las ventas por mesero o por caja, según un argumento provisto por el cliente y lo lleve a un archivo que se llame meseroN_fecha .txt o cajeroN_fecha.txt dependiendo del parámetro que pase el usuario.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.


Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Atención: la falta de espacios antes de asignar valor a las variables y el espaciado en las condiciones del if son intencionales y requeridas para que el script funcione apropiadamente.


Cierre

Los scripts de Shell pueden ser utilizados en múltiples formas. En administración de sistemas se pueden usar para crear cuentas de usuarios, monitorear el estado del sistema, cuantificar los usos de memoria e incluso determinar los procesos que están afectando el desempeño de un grupo de procesos. Muchas empresas utilizan el sistema operativo Linux por su flexibilidad, escalabilidad y los términos favorables de licenciamiento, especialmente en uso masivo.
El utilizar un sistema Linux te abre un abanico de opciones en cuanto a Shells utilizados para interactuar con el sistema operativo y la variedad de instrucciones para acceder a propiedades del sistema operativo.


Checkpoint

Asegúrate de:

  • Detectar las características de las diferentes distribuciones de Linux para elegir la apropiada a cada situación.
  • Reforzar los tipos de Shell que hay en Linux, particularmente el zsh para la correcta navegación de la línea de comandos.
  • Aplicar las instrucciones de Shell para automatizar tareas repetitivas.

Bibliografía

  • Geeks For Geeks. (2019, 3 de diciembre). Different Shells in Linux. Recuperado de https://www.geeksforgeeks.org/different-shells-in-Linux/
  • Geeks For Geeks. (2019, 30 de junio). Regular expression in grep. Recuperado de https://www.geeksforgeeks.org/regular-expression-grep/
  • Pedamkar, P. (s.f.). Shell Script Parameters. Recuperado de https://www.educba.com/shell-script-parameters/

La obra presentada es propiedad de ENSEÑANZA E INVESTIGACIÓN SUPERIOR A.C. (UNIVERSIDAD TECMILENIO), protegida por la Ley Federal de Derecho de Autor; la alteración o deformación de una obra, así como su reproducción, exhibición o ejecución pública sin el consentimiento de su autor y titular de los derechos correspondientes es constitutivo de un delito tipificado en la Ley Federal de Derechos de Autor, así como en las Leyes Internacionales de Derecho de Autor.

El uso de imágenes, fragmentos de videos, fragmentos de eventos culturales, programas y demás material que sea objeto de protección de los derechos de autor, es exclusivamente para fines educativos e informativos, y cualquier uso distinto como el lucro, reproducción, edición o modificación, será perseguido y sancionado por UNIVERSIDAD TECMILENIO.

Queda prohibido copiar, reproducir, distribuir, publicar, transmitir, difundir, o en cualquier modo explotar cualquier parte de esta obra sin la autorización previa por escrito de UNIVERSIDAD TECMILENIO. Sin embargo, usted podrá bajar material a su computadora personal para uso exclusivamente personal o educacional y no comercial limitado a una copia por página. No se podrá remover o alterar de la copia ninguna leyenda de Derechos de Autor o la que manifieste la autoría del material.