Optimizando tu día laboral: creando Comandos.
Tags: bash, programming, productivity, learning
Published: 2024-05-15 16:33:06

Cuando comenzamos en un proyecto, muchas veces tenemos que levantar varios repos, Docker, bases de datos, etc. y se vuelve bastante tedioso andar escribiendo y abriendo tabs en la terminal. 

No sé ustedes, pero más de una vez me quedé dormida el día que tenía que dar una demo y ya se pueden imaginar, tartamudeando medio dormida en inglés mientras trataba de setear todo para poder compartir pantalla. 

Y casi como Pepe grillo, lo tenía a Santi diciéndome: “Si te hubieses configurado los aliases, en dos segundos tendrías todo listo.” 

Antes de poder explicarles como crear sus propios comandos hay que empezar por el principio y ver algunos conceptos. 



![Disclaimer](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rl7t4if5xpspv7q6p3lq.png)

DISCLAIMER ESTA CHARLA ESTÁ ORIENTADA A MAC, LINUX O WSL. SORRY WINDOWS


###¿Qué es un SHELL?

Un sistema operativo hace uso de programas que se encargan de interpretar los comandos que introduce el usuario en una terminal y realizan las acciones en respuesta. Estos programas se denominan SHELL (Intérprete de Comandos).   
Existen varios tipos, pero los más utilizados son:


- **Bsh:** bourne SHELL
- **Bash:** bourne again SHELL
- **Zsh:** Z SHELL

<!-- macOS Catalina, lanzada en 2019, adoptó a Zsh como la SHELL predeterminada, reemplazando a Bash. -->


Los SHELL admiten comandos que pueden ser archivos o funciones ejecutables, por lo que cada usuario puede construir archivos combinando comandos base de Linux, paquetes de npm o ciertas estructuras especiales que le permita ser ejecutados desde una terminal.

Voy a asumir que usan la terminal y conocen algunos de los comandos básicos como **ls** para listar archivos y carpetas, **cd** para movernos entre los directorios y **rm** para borrar archivos o directorios. 

###PROGRAMACIÓN DEL SHELL

El SHELL puede aceptar no solo órdenes simples, desde la línea de comandos, sino también secuencia de órdenes, grupo de órdenes y órdenes condicionales. 
Piensen que un SHELL es como Node, pero en vez de interpretar JavaScript interpreta el lenguaje de comandos.


Permite construir programas y comandos llamados SHELL SCRIPTS que nos dejan automatizar diversas tareas. 


Yo uso como SHELL ZSH, que tiene un archivo para configurar que se llama .zshrc. ¿Qué tengo acá, aparte de los comandos? Personal tokens de GitHub, credenciales de mi trabajo, y alguna que otra configuración para el theme de la terminal.

Lo más importante para empezar a escribir comandos es que creemos un archivo, en este caso se va a llamar .ZSH_ALIASES en la misma carpeta donde tenemos el .zshrc que suele estar en la carpeta user. ¿Por qué? Como lo tenemos que llamar en ese archivo, entonces lo vamos a importar escribiendo:


![Como importar el archivo de aliases](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tyf4d7ulmnf902id5kxx.png)

¿Y ahora podemos empezar a escribir, no? Acá me topé con un par de cosas:

- En mi proyecto para abrir una de las apps dependo de otra para loguearme. ¿Cómo hago para que se levanten en simultáneo usando la misma tab?
- Tenemos distintas versiones de node en cada repo y lo tengo que setear antes de correrlo. 
- Tengo que levantar Docker porque si no, no tengo data.
- ¿Cómo quiero que se abra? ¿Todo en una misma tab o quiero que cada proceso se abra en una tab distinta?

Mientras yo me hacía estas preguntas, una vocecita me decía: “Vos no usas todos los containers de Docker, si necesitas ver los logs de uno solo ¿cómo haces?”


![Bugcat Capoo error](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bf8x8k3ncpeo7j2uzybd.gif)

Y para que no anden googleando o discutan con [Santi](https://twitter.com/spersico) en Twitter (o X, ya no tengo idea), 3 horas para encontrar la respuesta, se las doy yo:

- Instalar concurrently para poder correr comandos al mismo tiempo compartiendo la misma tab.
-  ttab -  Abre una nueva tab en la terminal (se recomienda en macOS instalarlo con brew). 


Ya contenta de que tenía todo listo para arrancar, escribí mi primera función ^^


![Mi primera funcion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8jkmfu8xkuypu7gxhtsw.png)

Navegamos hasta la carpeta, **nvm** para setear la versión de node, **npx** para que instale concurrently si no lo encuentra, **-k** para que corte todos los procesos cuando hacemos **ctrl+c** y **yarn** para que levante el proyecto (Nosotros necesitamos levantar dos en simultáneo)

Todo muy lindo, muy lindo hasta que voy a la terminal y veo:

![Error en consola](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/binb0o5mtnm7xwzleg3t.png)

Revisé el archivo, el import, todo y no daba con la tecla de porque no andaba. 

Quiero que quede claro que esto fue hecho a propósito para el ejemplo:


![autogenerando errores en el alias](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/awe0yttsz6avzdqac7bk.png)

Resulta que no le gustan los espacios, así que **NO DEJAR ESPACIOS ENTRE EL = Y EL COMANDO DEL ALIAS** (Esto no estaba en Google).


Sigamos, con respecto a lo de Docker, se solucionó de la siguiente forma: 

Esa **-d** significa **detach**. Levanta el container y lo corre en segundo plano dejando que el segundo conteiner que no tiene el **-D** corra en la ventana de la terminal y podamos leer los logs (que en este caso es lo que me interesaba) 

![Funcion para levantar docker](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iyu5uov560wnru9dbuli.png)

Ya casi terminamos, lo prometo. Ahora como hago para correrlo todo de un solo comando?

![comando final](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/it3qpbknkzi5gze1nob8.png)

_ttab -a iTerm2 es un comando predeterminado de ttab para los que tienen iTerm2._

El nombre de la función o funciones que declaramos antes, en este caso la de Docker y la del proyecto que son las que uso día a día. Y ahora sí corro el comando frontendUp, que me levanta en dos tabs distintas cada comando (en una docker y en otra las dos apps)


En conclusión, si bien me llevó un par de días de investigación, es una buena forma de optimizar el comienzo del día laboral y de paso renegamos con otra cosa que no es JS. 

Muchas gracias y vuelva prontos.