1 Presentación

Este tutorial es desarrollado por Pablo Vinuesa, CCG-UNAM (twitter: @pvinmex) a partir de material previo, presentado en diversos cursos y talleres, como Taller 3 - Análisis comparativo de genomas microbianos: Pangenómica y filoinformática de los Talleres Internacionales de Bioinformática - TIB2019, celebrados en el Centro de Ciencias Genómicas de la Universidad Nacional Autónoma de México, del 29 de julio al 2 de agosto de 2019.

Las versión actual (v.2022-09-26) contiene extensiones significativas con respecto a cursos anteriores, así como adaptaciones para el Taller de Ciencias Genómicas: de Moléculas a Ecosistemas, que impartimos investigadores del CCG-UNAM para de la Facultad de Ciencias - UNAM, así como para el curso de introducción a Linux que imparto en la Licenciatura en Ciencias Genómicas - LCG de la UNAM.

Si éste es tu primer contacto con Linux, te recomiendo que leas primero esta presentación sobre introducción al biocómputo en sistemas Linux - PDF.

1.1 Objetivos

Este documento sirve tanto como un tutorial completo de iniciación a la programación en \(AWK\) y \(Bash\) para bioinformática para los que no han tenido contacto previo con un sistema UNIX o GNU/Linux, como una referencia para usuarios avanzados.

Como muestra el índice, el tutorial avanza desde los aspectos más elementales de conexión a un servidor, navegación del sistema, propiedades de archivos y tuberías de filtrado de texto, a programación avanzada en AWK y BASH. Contiene muchísimos ejemplos prácticos, desde programas simples pero siempre útiles para ejecutar en la consola de comandos (1liners), a scripts avanzados, aptos para el trabajo de investigación en el área como fasta_toolkit.awk, extract_CDSs_from_GenBank.awk y run_phylip.sh. Éstos hacen uso de funciones, banderas, estructuras de control de flujo, estructuras de datos complejas, menús de usuario, y muchos otros atributos propios de programas profesionales. Estos ejemplos te servirán para aprender a programar herramientas bioinformáticas robustas y modulares, siguiendo mejores prácticas. El tutorial te enseña el uso práctico de todos los elementos sintácticos implementados en dichos scripts, los cuales puedes descargar del repositorio GitHub de este curso. Estos programas se describen en detalle en este documento.

1.2 Licencia y términos de uso

Este material didáctico lo distribuyo públicamente a través de este repositorio GitHub intro2linux bajo la Licencia No Comercial Creative Commons 4.0

Creative Commons Licence
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0

GNU General Public License v3
El código se distribuye bajo la licencia GNU General Public License v3

1.3 ¿Cómo correr los ejemplos de este manual?

Idealmente debes tener acceso local o remoto a una máquina UNIX o GNU/Linux. Si tienes una máquina Windows, otra opción es instalar mobaXterm home edition, como se explica en el esta sección README del repositorio

1.4 ¿Cómo obtener la última versión de este documento?

Tienes básicamente 2 opciones:

  1. clonar el repositorio intro2linux y correr con frecuencia el comando git pull, como se explica en el REAEME del repositorio
  2. navegar y/o descargar directamente el archivo html del manual

La primera es la más conveniente, ya que no sólo descargas el archivo html del curso, sino todos los scripts y datos asociados para que puedas seguir cada ejemplo.

2 El Proyecto de Software Libre GNU

al mundo de cómputo y software libre del proyecto GNU. Antes de empezar este tutorial, sugiero que te informes sobre lo que es el proyecto GNU, iniciado por Richard Stallman (rms) en 1983 y desarrollado por una enorme comunidad de programadores, y su relación con Linux, para formar el sistema de cómputo libre GNU/Linux.

Así lo explica rms en su artículo Linux y el sistema GNU, del que cito los primeros dos párrafos abajo:

Muchos usuarios de ordenadores ejecutan a diario, sin saberlo, una versión modificada del sistema GNU. Debido a un peculiar giro de los acontecimientos, a la versión de GNU ampliamente utilizada hoy en día se la llama a menudo «Linux», y muchos de quienes la usan no se dan cuenta de que básicamente se trata del sistema GNU, desarrollado por el proyecto GNU.

Efectivamente existe un Linux, y estas personas lo usan, pero constituye solo una parte del sistema que utilizan. Linux es el núcleo: el programa del sistema que se encarga de asignar los recursos de la máquina a los demás programas que el usuario ejecuta. El núcleo es una parte esencial de un sistema operativo, pero inútil por sí mismo, sólo puede funcionar en el marco de un sistema operativo completo. Linux se utiliza normalmente en combinación con el sistema operativo GNU: el sistema completo es básicamente GNU al que se le ha añadido Linux, es decir, GNU/Linux. Todas las distribuciones denominadas «Linux» son en realidad distribuciones GNU/Linux.

Richard M. Stallman

2.1 La controversia sobre el nombre: ¿GNU/Linux o sólo Linux?

Hay que aclarar que destacados miembros de la comunidad de desarrolladores de software libre esgrimen diversos argumentos por los que consideran que el sistema no se debe llamar GNU/Linux, favoreciendo el nombre de Linux.

Sirva de ejemplo uno de los comentario de Linus Torvalds:

Umm, this discussion has gone on quite long enough, thank you very much. It doesn’t really matter what people call Linux, as long as credit is given where credit is due (on both sides). Personally, I’ll very much continue to call it “Linux”, …

The GNU people tried calling it GNU/Linux, and that’s ok. It’s certainly no worse a name than “Linux Pro” or “Red Hat Linux” or “Slackware Linux” …

Lignux is just a punny name—I think Linux/GNU or GNU/Linux is a bit more “professional” …

Linus Torvalds

Es importante notar que muchas de las distribuciones de Linux, incluyendo Ubuntu, no siguen estrictamente el principio de software libre de GNU. Ubuntu, por ejemplo, incluye el repositorio \(restricted\), que contiene paquetes soportados por los desarrolladores de Ubuntu debido a su importancia, pero que no está disponible bajo ningún tipo de licencia libre. Ejemplos notables son los controladores propietarios de algunas tarjetas gráficas, como los de ATI y NVIDIA. Ello ha permitido que Ubuntu sea una de las distribuciones de Linux con mayor compatibilidad de hardware y facilidad de instalación. Por ello recomiendo y uso esta distro.

2.2 Nota de agradecimiento y postura personal

En lo personal, soy pragmático y agnóstico en lo que respecta a la controversia. Estoy muy agradecido a toda la comunidad por haber desarrollado, integrado y puesto a nuestra disposición esta maravilla de entorno de cómputo libre: kernel, sistema operativo y software. Por ello gustosamente doy crédito al proyecto GNU y al el núcleo o kernel, desarrollado originalmente por Linus Torvalds y conocido actualmente como núcleo Linux. Desde el año 2004 realizo todo mi trabajo en este entorno.

Como académico coincido plenamente con la visión de rms en que los centros de educación pública deberían de usar el entorno GNU/Linux, idealmente desde la secundaria. En diversos lugares, notablemente en India, este mensaje de rms ha calado hondo. El estado de Kerala fue pionero: desde 2006 toda la educación pública de Kerala se hace en en el entorno GNU/Linux, habiendo eliminado Windows y software privativo de las escuelas estatales. Otros estados como Karnataka, Gujarat, Assam, West Bengal siguieron rápidamente el ejemplo, incorporando software libre y código fuente abierto - OSS´ como una clave de sus sistemas educativos. Es una tendencia respaldada actualmente por el gobierno Indio, como pueden leer aquí: Adoption of Free and Open Source Software in India. El resultado es contundente - la India es actualmente una potencia mundial en cómputo y matemáticas.

Mi modesta pero activa manera de contribuir a la promoción del uso de software libre y código fuente abierto en México y Latinoamérica es divulgando el uso del ambiente de cómputo GNU/Linux a alumnos universitarios mediante cursos en diversos países de habla hispana, y promoviendo su implementación en la universidad, particularmente en la LCG-UNAM. Me referiré a este ambiente de cómputo con ambos nombres (GNU/Linux y Linux), para expresar mi neutralidad al respecto de la controversia arriba mencionada, aunque tiendo a preferir el uso de GNU/Linux para remarcar el crédito a todos los componentes de esta extraordinaria “simbiosis”.

2.3 GNU - Documentación y recursos GNU

Todo software de calidad debe de estar bien documentado. Sin duda la documentación del software GNU es extraordinaria. No dejes de visitar al menos estos recursos:

2.3.1 Referencias adicionales

Una vez que domines los comandos básicos que se presentarán en este documento, recomiendo revisar tutoriales más detallados y completos como los siguientes:


3 Primer contacto con un sistema Linux - navegación del sistema

Si no has trabajado previamente con la consola de comandos, debes empezar en esta sección que te guiará paso a paso para aprender rápidamente los fundamentos del \(Shell\).

3.1 Conexión a un servidor y exploración de sus características básicas

Estas prácticas están diseñadas para correr en un servidor remoto, pero puedes hacerlo también en una sesión local, es decir, en tu máquina. Sólo tienes que poner en un directorio los archivos con los que vamos a trabajar, los cuales puedes descargar del directorio intro2linux/data del sitio GitHub.

3.1.1 ssh establecer sesion remota encriptada (segura) via ssh al servidor con número dado de IP

ssh -l $USER IP
  • Nota: para poder desplegar el ambiente gráfico en el servidor remoto debemos hacer el login con:
ssh -X $USER@IP

Al establecer una sesión remota vía \(ssh\), la inicias en tu \(HOME\)

3.1.2 hostname muestra el nombre del host (la máquina a la que estoy conectado) y la IP

hostname
hostname -i
## alisio
## 127.0.1.1

3.1.3 uname muestra información sobre el sistema y detalles del kernel o núcleo

uname
uname -a
## Linux
## Linux alisio 5.15.0-48-generic #54~20.04.1-Ubuntu SMP Thu Sep 1 16:17:26 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

3.1.4 lsb_release muestra información sobre la distribución instalada

lsb_release -a
## No LSB modules are available.
## Distributor ID:  Ubuntu
## Description: Ubuntu 20.04.5 LTS
## Release: 20.04
## Codename:    focal

3.1.5 df reporta el uso de disco del sistema

df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                       40G  2,6G   35G   7% /
tmpfs                 174G  3,1G  171G   2% /dev/shm
/dev/sda3             190M   90M   91M  50% /boot
/dev/mapper/VolGroup00-LogVol05
                     1012G  913G   49G  95% /home
/dev/mapper/VolGroup00-LogVol03
                       30G   23M   28G   1% /tmp
/dev/mapper/VolGroup00-LogVol02
                       59G   16G   41G  28% /usr
/dev/mapper/VolGroup00-LogVol04
                       79G  9,1G   66G  13% /var
/dev/mapper/VolGroup01-LogVol00
                      739G  518G  184G  74% /export/apps
/dev/mapper/VolGroup01-LogVol01
                       17T   16T  731G  96% /export/space1
buluc-cluster:/export/space2/users
                       17T   17T  461G  98% /export/space2/users
bonampak-cluster:/space29/data
                       12T   11T  938G  92% /export/space29/data

3.1.6 free reporta la memoria del sistema y kernel

free -g # -g indica la memoria en gibibytes

             total       used       free     shared    buffers     cached
Mem:           346        253         93          0          2        197
-/+ buffers/cache:         53        293
Swap:          351         16        335

3.1.7 top o htop muestran los procesos en ejecución y los recursos que consumen

htop # sales con q o CTRL-c