Terminal, shells, y niveles de abstracción

Muchos programas de bioinformatica no poseen una interfaz grafica, solo usando la terminal como forma de interacción.

  • Graphic User Interface son programas con ventanas y botones, que manejamos en dia a dia.
  • Terminal permite interactuar con la computadora mediante comandos del teclado, desde instrucciones a pulsasiones de teclas.
    • Shell es el interprete de comandos que media entre el usuario y el kernel. Existen en distintos tipos, como Bash, Zsh, PowerShell, etc.
      • Kernel es la parte fundamental del sistema operativo, que hace interfaz con el hardware. Multiples SO comparten un mismo kernel, como todos los flavors de Linux, o las versiones de Windows con Kernel NT.
        • Host es la maquina en si, los procesadores que interpretan codigo binario, bits de memoria, etc.

Porque la terminal es cool?

  • Acceso programatico, aka. que scripts y programas pueden acceder a la terminal para hacer trabajo.
    • Objetivmante R, Python, etc. son lineas de comandos. RStudio solo es una interfaz bonita encima.
  • Ejecutar acciones complejas, como configurar multiples clusters desde un unico .config
  • La mayor parte de los programas tiene un CLI pero no necesariamente un GUI, especialmente programas nicho como los usados en Ciencia.
    • Hadoop, Slurm
    • Clusters de computo: CERN, Leftraru, etc.
    • AWS-CLI, git, rsync, etc.

Shells más usadas

  • PowerShell en Windows. Es más un lenguaje de scripting que una shell interactiva
  • BASH Bourne Again SHell en la mayor parte de los sistemas Linux.
  • ZSH o Z-SHell es una shell moderna pensada en interactividad, con soporte para corrección ortográfica, sugerencias, autocompletado, etc. Está por defecto en Mac OS
  • FISH Friendly Interactive SHell una shell para 1990’. Soporta autocompletado, plugins, sugerencias, etc. Un contra es que la sintaxis es distinta a la de bash, por lo que aun requiere bash para programas bash.

Instalando lineas de comandos POSIX en Windows

Gestor de paquetes en Windows

A diferencia de la mayor parte de los sistemas Linux, Windows no trae nativamente un gestor de paquetes, aka. una utilidad encargada de instalar programas desde un repositorio central, como apt o CRAN.

Existen alternativas de terceros, como Chocolatey, que nos permiten instalar programas via comandos.

Consideraciones

  • Esto requiere una terminal Powershell en modo administrador (porque estará instalando programas)
  • Requiere internet (para acceso al repo de programas)
  • Requerimientos adicionales aplican a WSL2

Para instalar Chocolatey, se usa la linea de comandos de Powershell de Windows

Set-ExecutionPolicy Bypass -Scope Process -Force;
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

La instalación dura unos pocos segundos, y luego se puede convocar a Chocolatey con el comando choco. Una lista de comandos se puede convocar con choco help

Más comandos de Chocolatey

  • choco install <paquete1> <paquete2> permite instalar multiples paquetes en un comando. --yes sirve para omitir las confirmaciones. Por ejemplo choco install 7zip chrome -y
  • choco search <paquete> busca un programa en el repositorio central. Por ejemplo, choco search cytoscape
  • choco list --local lista los paquetes instalados con Chocolatey. choco list lista todos los disponibles en el repositorio central (+1,300)
  • choco upgrade all actualiza todos los paquetes actualizables. Recomiendo usar --yes
  • choco uninstall <paquete> permite remover cosas

Instalando WSL2 en Windows

Las ultimas versiones de Windows incluyen un Kernel Linux que corre de forma paralela al Kernel Windows NT propio de Windows. Este se denomina Windows Subsystem for Linux, y es capaz de correr aplicaciones para Linux, hasta sistemas operativos como Ubuntu o Mint.

WSL2 es la segunda versión mayor de este, con compatibilidad y rendimiento mejorados.

Consideraciones

  • Requiere Windows posterior a 1903, ie. la versión de Marzo 2019

Para instalar WSL2, lo más facil es usando Chocolatey desde la consola en modo administrador (como la que usamos para instalarlo). Despues de completar la instalación, es necesario reiniciar la computadora para que pueda iniciar el Kernel Linux.

# Instalación de WSL2
choco install wsl2 -y

# Reboot del sistema
Restart-Computer

Instalando Ubuntu como subsitema en Windows

La opción más efectiva es desde la Tienda de Windows. Tambien es posible usar Chocolatey, pero por limitaciones de interoperabilidad de WSL2, choco no puede usarlo directamente y se ve limitado a usar WSL1.

Luego, es posible acceder a la consola de Ubuntu con el comando ubuntu2004. Por defecto, esta incluye bash, ssh, git, etc.

Este primer inicio es más lento que los siguientes, dado que el sistema instalara Ubuntu sobre el kernel, y ademas pedira la creación de un usuario para el sistema.

ubuntu2004
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: USUARIO
New password:
Retype new password:
passwd: password updated successfully
Installation successful!

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 4.4.0-19041-Microsoft x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Tue Nov 10 14:28:55 -03 2020

Para salir de este ambiente Ubuntu, usamos logout como en una sesión SSH.

Otros ambientes Linux para WSL2

Comandos básicos

La mayor parte de estos comandos existen tanto en Linux como en Windows Powershell (aunque en este ultimo realmente son alias). La principal diferencia es como las shells manejan directorios, con / en POSIX y \ en Windows; y como manejan comandos multilinea, \ y ` respectivamente.

La parte más compleja y menos interoperable es cuando usamos comandos con -parametros.

Descargando archivos

  • curl es C (see) URL, mapeado a Invoke-WebRequest en Powershell.
    • curl <url> -o <archivo> descarga una URL para guardarla en un archivo
    • curl -O <url> descarga la URL a un archvio con su nombre. Usualmente usamos esto
  • wget es Web GET, mapeado a Invoke-WebRequest en Powershell. Es el más facil de usar.
    • wget <url> <url2…> descarga la URL a un archvio con su nombre
    • wget -c <url> permite continuar una descarga interrumpida (muy util para cosas de varios GB)
  • Invoke-WebRequest requiere un output explicito.
    • Invoke-WebRequest <url> -OutFile <archivo>
    • Invoke-WebRequest <url> -Method Get -o <archivo> funciona igual que Wget
    • curl <url> -o <archivo> es valido en Windows base
curl "https://datosrnaseq.s3.amazonaws.com/ejemplo.zip" -o "ejemplo.zip" # Descargando un ejemplo

Descomprimiendo archivos

  • tar, no existe en Windows.
    • … xf … son parametros para eXtract y File
    • tar xf <tar.gz.bz2.xz> desempaca un tar (comprimido) al directorio local
    • tar xf <tar.gz.bz2.xz> -C <directorio> desempaca el tar a un directorio especifico
    • Los tar por defecto no están comprimidos. Un tar.gz si lo está.
    • tar cf <nuevo.tar> <archivo1 directorio/*> crea un archivo tar.
    • tar cgf <nuevo.tar.gz> <archivo1 directorio/*> crea un archivo tar comprimido.
  • unzip, no existe en Windows.
    • unzip <zip> extrae los contenidos de un zip en el directorio actual
    • unzip <zip> -d <directorio> extrae el zip a una carpeta especifica
    • zip -r <nuevo.zip> <directorio> comprime un directorio a un zip.
  • Expand-Archive es una utilidad de Windows que funciona como unzip
    • Expand-Archive <zip> <directorio> descomprime un zip en un directorio existente o nuevo
    • Compress-Archive -Path <directorio\*> -DestinationPath <nuevo.zip> crea un zip con los contenidos de directorio
  • 7zip tiene linea de comandos para Linux, Mac, Windows.
unzip ejemplo.zip -d Ejemplo       # Linux
Expand-Archive ejemplo.zip Ejemplo # PowerShell

Explorando y renombrando archivos

  • cat es conCATenate, mapeado a Get-Content en Powershell.
    • cat <archivo> pasa los contenidos de archivo a la terminal, mostrandolos
    • cat <archivo1> <archivo2> > <nuevo> reemplaza los contenidos de nuevo por la concatenación de archivo1 y archivo2
    • cat <achivo3> >> <nuevo> concatena archivo3 a nuevo
  • head, no existe en Windows.
    • head <archivo> muestra las 10 primeras lineas de archivo
    • head -n <archivo> muestra las n primeras lineas de archivo
    • En Windows, Get-Content <archivo> -TotalCount 10 tiene el mismo comportamiento
  • tail, no existe en Windows.
    • tail <archivo> muestra las 10 ultimas lineas de archivo
    • tail -n <archivo> muestra las n ultimas lineas de archivo
    • En Windows, Get-Content <archivo> -Tail 10 tiene el mismo comportamiento
cd Ejemplo       # Entra al directorio descomprimido
cat script.r     # Explorando el script

Ejemplo de GREP para archivos

GREP significa “global regular expression print”, es utilizado para realizar busqueda de patrones en archivos de textos.

Por defecto el comando grep devolvera todas las lineas en la que la expresion regular hace match. Cabe destacar que se pueden utilizar operadores dentro del argumento de la expresion regular.

grep "expresion_regular" <archivo>

Opciones utiles:

-i Ignora mayusculas/minusculas -w Patron de palabra completa -v Inversion de grep, devuelve las lineas que no tienen match -l Devuelve el nombre de los archivos que contienen el match -c Cuenta y devuelve el numero de match para el patrón entregado

Operadores de expresiones regulares mas utilizados:

. hace match con todos los caracteres.
? El caracter subsecuente hace match como maximo 1 vez. * El caracter subsecuente hace match 0 o mas veces.
+ El caracter subsecuente hace match 1 o mas veces.
Por lo general querremos usar el comando grep en conjunto de otros comando utilizando pipes.

Por ejemplo:

 grep -i "salmon" try1.csv
 grep -w "salmon" try1.csv
 grep -v "infected"
 grep -c "GSM" try1.csv 
 grep -w "salmonis" try1.csv
 #podemos combinar las opciones
 grep -ci "salmon" try1.csv
 grep -ciw "salmon" try1.csv
 #utilizando algunos operadores para expresiones regulares
 grep "inf." try1.csv
 grep  "GSM[0-9]*" try1.csv 

Ejemplo de Sed

Otro programa que podemos usar para reemplazos rapidos es Scripted EDitting, que tiene una sintaxis similar a grep pero un foco más en scripts para modificación de texto. Osea, esta pensado más para escribir scripts que automatizen un trabajo repetitivo, más que para ser usado continuamente.

Un caso de uso es reemplazar variables como rutas de archivos dentro de un cript o programa que qeuremos correr. Por ejemplo, esta tabla procesar.tsv incluye una ruta global que no existe en el nuevo sistema.

sample-id forward-absolute-filepath reverse-absolute-filepath
sample-001 /home/qiime2/sample001_R1.fastq.gz /home/qiime2/sample001_R2.fastq.gz
sample-002 /home/qiime2/sample002_R1.fastq.gz /home/qiime2/sample002_R2.fastq.gz
sample-478 /home/qiime2/sample478_R1.fastq.gz /home/qiime2/sample478_R2.fastq.gz

En este caso es preferible reemplazar /home/qiime2 por una variable de ambiente $DATOS que apunta al directorio donde están.

# Probamos el comando
# Significa -recursive substitute/A/B/global <archivo>
sed -r 's/\/home\/qiime2/\$DATOS/g' procesar.tsv | head -5
sample-id forward-absolute-filepath reverse-absolute-filepath
sample-001 $DATA/sample001_R1.fastq.gz $DATA/sample001_R2.fastq.gz
sample-002 $DATA/sample002_R1.fastq.gz $DATA/sample002_R2.fastq.gz
sample-478 $DATA/sample478_R1.fastq.gz $DATA/sample478_R2.fastq.gz

Validando que el reemplazo funciona, podemos hacerlo definitivo con -i in-place

sed -i 's/\/home\/qiime2/\$DATOS/g' procesar.tsv
  • Podemos reemplazar multiples -expresiones en un unico comando sed -e 's/<regex>/<reemplazar>/' -e 's/<regex>/<reemplazar>/' <archivo>

  • O usar otro caracter que no sea usado en nuestro reemplazo, en lugar de / sed 's#<regex>#<reemplazar>#' <archivo>

Editores

Nano

Este es el editor más familiar, con un modo de edición similar a Notepad, Word, cualquier programa general de texto.

  • ^C significa Ctrl C. Por ejemplo, para guardar y salir es ^X, o Ctrl x
  • M-6 significa Macro 6. Usualmente la tecla macro está mapeada a Alt

Vi

Vi es un editor enfocado en código, por lo que el paradigma es distinto a los de un editor comun como Notepad. En primer lugar, vi tiene varios modos operativos.

  • Normal, Esc en que espera otros modos
  • Insert, i en que inserta texto normalmente, como seria Notepad.
  • Replace,R en que reemplazamos el bufer preexistente, como modo insert
  • Command,: para comandos asignables como :comando, por ejemplo :wq! Writte Quit (all)

Luego, existen comandos distintos para hacer cosas en modo Normal

  • O y o señalan crear una nueva linea arriba o abajo de la actual
  • Usamos h o l para movernos irquierda o derecha
  • Usamos j o k para movernos arriba o abajo
  • x elimina caracteres. 5x elimina 5 caracteres
  • dw elimina palabras. 5dw elimina 5 palabras
  • dd elimina una linea. 5dd eliminaria 5 lineas
  • . repite el ultimo comando. Por ejemplo 5dw . eliminaria 10 palabras

Existen muchas más opciones para Vi y sus derivados, como Vim. Varios programas, como VS Code, aceptan una sintaxis como Vi, dado que resulta más rapida para escribir código. ss64 tiene un cheatsheet rapido de Vi. Wikibooks tiene un libro sobre Vi y Vim.

Manipulando computadoras remotas via SSH

Secure SHell es un programa presente en Linux y Windows (activado por defecto en las ultimas versiones), que permite establecer conexion a un host remoto a travez de una linea encriptada.

  • ssh <USUARIO>@<IP> permite conectarse mediante contraseña especificando un <USUARIO> en una maquina con cierta <IP>
  • ssh <USUARIO>@<DIRECCIÓN> funciona si la maquina tiene una dirección de DNS, por ejemplo, aws-ec2-us-west-1-14df132ax13122300.com
    • Pueden obtener direcciones en DuckDNS.org o No-IP, para lo cual necesitan configurar un cliente para la DyDNS, y si es una computadora propia, hacer port-forwarding en el router
  • ssh -i "Downloads/KEY.pem @` permite autentificarnos con una clave criptografica. Esto elimina la necesidad de una contraseña, y son usadas por multiples plataformas como Azure o AWS para incrementar la seguridad

Copiando archivos entre remotos y locales con SCP

  • scp Secure CoPy permite transferir archivos entre un computador remoto y un local.
    • scp <remoto>:<archivo-remoto> <archivo-local> para copiar de un remoto a local
    • scp <archivo-local> <remoto>:<archivo-remoto> para copiar de un remoto a local
    • scp -r <remoto>:<directorio-remoto> <local> para copiar un directorio remoto a local

Manualmente, SCP funciona para transferencias pequeñas, como scripts (.Rmd, .py) o archivos de datos individuales. Para transferir cantidades más grandes de datos (10s GB; 100+ archivos), podemos usar RSync, abrir el servicio SFTP de la maquina Linux, o usar servicios gestionados como Dropbox, Google Drive, OneDrive, etc; que resultan más convenientes.

Acceso a Leftraru - Servidor de Supercomputo de Beacuhef

Guia para conectarse mediante SSH al Laboratorio Nacional para Computación de Alto Rendimiento.

SACRIFICANDO UNA EC2 para que vean porque root es demasiado poderoso

En casi todo sistema, es mala idea correr comandos como administrador.

sudo rm -fr ./ # Elimina contenidos de la carpeta local
sudo rm -fr  / # Elimina contenidos de root, aka. el sistema operativo y demás 

Extras! - Cosas utiles y git para el proximo taller

  • Windows Terminal es la nueva terminal de Windows, con soporte para pestañas, multiples ambientes, mejores visuales, etc.
  • TLDR, Too Long; Didn’t Read es una colección de manuales y paginas de ayuda resumidas para varias utilidades de terminal.
    • TLDR.ostera.io tiene una versión accesible via web
    • tldr apt-get muestra un ejemplo y caso de uso de apt-get
    • apt-get install tldr instala TLDR
    • (aún) no está para Windows directamente

Instalando git

En Windows

choco install git --yes

En Linux

En la mayor parte de las distros ya viene preinstalado. Sino, se puede instalar siguiendo esta guia.

Comprobando la instalación

git version # muestra la versión
git version 2.29.2.windows.1

  1. FONDECYT Postdoctoral Fellow, Universidad de Chile, ↩︎

  2. Pregrado, Universidad de Chile↩︎