CORE Code School

Pierde el miedo a la terminal

13 minutos

Vamos a ver algunos conceptos sobre que es la terminal, para que sirve y como funciona. Aprenderemos los comandos más básicos de navegación para iniciar la interación con el ordenador y la sintáxis básica de bash. Por ultimo veremos algunos ejemplos practicos que podemos utilizar y algunos tips para customizar nuestra terminal y hacerla nuestra.

🧐 ¿Qué es la terminal?

Es un software que nos permite de interactuar con el ordenador, pero en lugar de hacerlo a traves de iconos y movimientos del raton, en lo que conocemos como GUI (Graphical User Interface), se hacen con texto y comandos.También llamamos a la terminal CLI (Command Line Interface).

Existen muchas variantes de terminal: bash, shell, zsh, iTerm, etc. Sin detallar demasiado cada una de ellas, nos estaremos referiendo en ese artículo a la terminal de tipo Unix-like que usen lenguaje Bash. Es el más utilizado y más standard en la industria. Si usas Mac o Linux por defecto la terminal que estarás usando cumple esos requisitos.

En Windows es un poco diferente y se conoce como cmd.exe. Aunque comparta muchas similaridades en la sintaxis hay muchas incompatibilidades.

Por ejemplo, el comando ls usado en ambos mac y Linux, tiene como equivalente el dir en Windows. Si quieres usar los mismos comandos en Windows que en Mac o Linux puedes instalar Git Bash o WSL (Windows Subsystem for Linux). Descarga aquí Windows Subsystem for Linux

🚨 ¿Por qué debo usarla?

Es popular y se valora muy positivamente que la conozcas y te desenvuelvas en ella.

Tiene utilidades muy importantes:

  • Es esencial para usar git para control de versiones.
  • Es esencial para tecnologias cloud.
  • Teclear es más rápido que usar el ratón.

Bonus: Puedes simular ser un Hacker 🤘🏻😎.

📲 El prompt

Al abrir la terminal, lo primero que veremos será algo parecido a:

En Mac

bash
MacBook-Pro:~ core$

En Ubuntu

bash
core@linux-desktop: ~$

En Windows cmd.exe

bash
C:\Users\Core>

A esa información con el cursor pulsando al lado se llama el prompt, que es el señal de nuestra entrada, es la manera como el ordenador nos dice que está escuchando y esperando lo que le vayamos decir. La información contenida en general es:

  • Nombre del Ordenador
  • Nombre de usuario
  • Directorio actual
  • Signo de prompt $

En general, el prompt se representará con uno de esos signos: $, %, #, :, >, _. Pero puede cambiar segun el sistema operativo. Además lo puedes personalizar a tu gusto!

📁 Directorios y rutas

Una vez estamos con la terminal abierta, ordenador esperando, necesitamos saber donde estamos.

Por suerte, como hemos visto antes, el directorio actual en general sale en el prompt, en ese caso es el directorio "~".

Nuestra home ( ~ )

La virgulilla (~), es un carácter especial, un alias (cognombre), que se refiere a la carpeta home, o sea, tu carpeta de usuario. En el caso de Windows, vemos toda la dirección C:\Users\Core. En los demás caso, el mote más corto.

Para ver el directorio donde estamos, podemos usar pwd el primero de los comandos que aprenderemos.

➥ pwd

Los programas y comandos en la terminal suelen tener un nombre que significa algo (para facilitarnos la vida), pwd significa Print Working Directory y imprime en pantalla el directorio actual (donde estamos trabajando).

La respuesta poderá ser algo similar a:

bash
$ pwd /Users/core

Aquí podemos ver el path o ruta completa de la carpeta home del usuario core. Nos falta por el momento, conocer el contenido de esa carpeta.

➥ ls

Para ver todo el contenido de una carpeta o por defecto, la carpeta donde estamos, podemos utilizar el comando ls para listar los ficheros y carpetas dentro de este.

Pruebalo. Obtendás un resultado similar a esto:

bash
$ ls Applications Downloads Music Public core Desktop Library Pictures Documents Movies code

En esta lista vemos (casi) todos las carpetas y ficheros que tenemos en nuestra carpeta home. ¿Por qué casi? Porque hay ficheros y carpetas ocultos. Para poder verlos, tenemos que usar de una opción (también llamadas flags) del comando ls.

⚛️ Opciones o Flags

En lugar de usar solo el comando ls, añadimos la opción a (all). Las opciones siempre van después del comando y con el caracter -.

Prueba el comando:

bash
ls -a

Ha cambiado el resultado? Que notas en los ficheros y carpetas ocultos? Todos sus nombres empiezan con ..

Si quieres hacer un fichero o carpeta oculto, pon un punto al principio de su nombre.

Hay otras opciones para ls, por ejemplo, al hacer el comando ls -l, vemos la versión (long) larga del listado del directorio.

➥ cd

Hemos visto como localizarnos y saber que contenido tenemos disponible en el directorio de la terminal. Pero, ¿Cómo nos movemos entre los diferentes directorios? El comando cd (Change Directory) seguido de el nombre de la carpeta a la cual queremos acceder, prueba, por ejemplo:

bash
cd Downloads

Eres capaz de ver el contenido de Downloads con el comando ls ahora?

NOTE: Si quieres volver al directorio anterior, puedes utilizar el comando cd ..

En la lenguaje de la terminal, .. significa el directorio superior al en que nos encontramos.

A un conjunto de direcciones le llamamos ruta o path. En él, los diferentes directorios en el camino se separan por / .

Si estamos en la carpeta Downloads (es nuestro cwd), podríamos hacer

cd ../Music/Beatles

para salir de Downloads, entrar en Music y dentro de ese, entrar en Beatles.

Argumentos

Al hacer cd, le tenemos que decir un path a un directorio. Pero al contrário de lo que hemos visto anteriormente, eso no es una opción. Es un argumento que se pasa al comando (o programa).

De manera general todos los comandos en la terminal van seguir la misma forma:

bash
command [ --options ] [Arguments]

Command

Es cualquier programa que esté disponíble en el CLI. Además de los que vienen por defecto, puedes instalar los que necesites y incluso escribir tus proprios programas para la terminal.

Options

Son algunos de los parametros que podemos selecionar en un programa. Pueden presentarse como una unica letra con - o en un formato más largo con --.

bash
ls -a -l -s --verbose --update-server

En el caso de las opciones (también llamadas flags) que son letras individuales, se pueden combinar en secuencia, eso es, los dos comandos abajo funcionan exactamente igual:

bash
ls -a -l ls -al

Arguments

Los argumentos son valores exteriores que pasamos al programa, pueden ser directorios, ficheros, numeros, palabras o cualquier otro tipo de dato.

Los diferentes argumentos siempre se separan por espacios! Así que si tu argumento contiene un espacio, debes utilizar commillas o usar la \ para escapar el espacio.

Algunas veces los argumentos necesitan que se indique a que parametro se asocia, en ese caso, debemos ponerlo despues de una opción, por ejemplo:

bash
convert help.wav --format mp3 --output help.mp3

⚠ Ayuda y manual

Pero como podremos saber todas las opciones y argumentos que podemos o tenemos que pasar a un comando?

La verdad es que, aunque los que más usamos se fijan en la memoria, muchas veces necesitamos un recordatorio. Y no hace falta ni siquiera salir de la terminal.

La mayor parte de los programas acepta un flag de ayuda -h o --help.

Prueba vi -h para ver la ayuda de VIM, el editor de texto por defecto en terminales Unix. Sobretodo en las páginas de ayuda es util la seccion usage al principio que te resume como tienes que usar a ese programa.

Otra posibilidad, mas extensa y con más información es mirar el manual del programa. Eso no se hace con un flag, sino que con un comando proprio:

bash
man vi

Usa las flechas para subir y bajar en el manual, y cuando estés listo, pulsa la q (quit) para salir.

🎓 Creando y borrando

Además de navegar por los diferentes ficheros y directorios de nuestro ordenador, queremos ser capaces de hacerle cambios. Abajo tenemos algunos comandos basicos que podéis investigar.

➥ mkdir

Ese es el comando make directory, que nos permite crear una carpeta nueva vacia. Lo único que necesitamos es pasarle como argumento el nombre o path de la carpeta que queremos crear.

mkdir code/projects/rest_api

➥ touch

El comando touch es similar al anterior, pero en lugar de crear un directorio, crea un fichero vacio.

touch server.py

➥ cat

Ese comando que recibe su nombre de la palabra concatenate, lo que hace es enseñarnos el contenido de un fichero.

bash
cat index.html

Hay comandos similares que podemos investigar, como el head y el tail, que nos enseñan el principio y el final del contenido de un fichero respectivamente.

➥ rm

El comando remove hace exactamente lo que dice, nos borra un fichero o una carpeta. La diferencia es que para borrar un directorio necesitamos añadir el flag -r, de recursive.

bash
rm index.html
bash
rm -r code/projects/rest_api

WARNING: El comando rm no te hace una pregunta de confirmación y es un proceso sin vuelta. Ten cuidado al usarlo para no borrar cosas importantes.

🔁 Redirecting y Piping

Por supuesto que no queremos que nuestros ficheros se queden en blanco, vacios. Queremos añadirles contenido.

Como hemos visto anteriormente, existe en la propria terminal un editor de texto, en realidad hay una serie de posibilidades: VIM, nano, emacs, etc.

Pero una otra manera de introducir datos a un fichero es a partir de la ejecución de un otro comando, en una operación que se llama:

Redirecting

Para esa operación, utilizamos un operado, el >. Antes del operador le añadimos el comando cuyo output queremos escribir en un fichero, y después de él, el nombre del fichero, por ejemplo:

bash
cal > calendario

Al ejecutar esa línea de comando, el output de cal (el calendario del mes actual) se guardará en un fichero llamado calendario.

Append

Si volvieramos a ejecutar un comando con el operador >, sobrescribiriamos el contenido del fichero y el calendario que estaba puesto anteriormente.

Hay, entretanto, otro operador que en lugar de sobrescribirlo, lo añade al final del fichero, manteniendo el contenido original y incluyendo el nuevo. Ese operador es el >>, probamos:

bash
date >> calendario

Si miramos ahora el contenido del fichero calendario, ambos el calendario y la fecha y hora actual estaran disponibles.

Pipe

No siempre queremos que el output, i.e.: la respuesta, de un comando se guarde en un fichero. Muchas veces queremos que ese output sea el input (el argumento) de un otro comando. No lo podemos hacer con el operador de redirección, hay un operador específico para eso, el operador pipe, representado por el caracter |.

Vamos probar ver los ficheros y carpetas que tenemos en la carpeta home, pero solo las ocultas. Ya sabemos que ls -a nos enseña ocultos y no ocultos.

Podemos filtrar con el comando grep, la simplificación del nombre muy complejo globally search for a regular expression and print matching lines. En resumen, que nos busca patrones. El patrón que queremos es buscar los ficheros y carpetas cuyos nombres empiezan con . .

Grep utiliza regular expressions y la expresión para buscar objetos que empiecen con un punto es "^\.".

Probemos ls -a | grep "^\." y deberemos ver solo los ficheros y carpetas cuyos nombres empiezan por un punto. En ese sentido la combinación del pipe con el comando grep es muy util para buscar información.

Por ejemplo, si queremos saber que procesos de MySQL están activos en nuestro ordenador, poderíamos hace ps -ax | grep mysql

Creando un alias

Si un comando lo usamos mucho y queremos darle un alias, es muy sencillo. Y así podemos facilitar nuestra vida. Por ejemplo, vamos hacer un atajo que nos lleve directamente al Desktop.

bash
alias cddk='cd ~/Desktop'

A partir de ese momento, el comando cddk nos llevará directamente al Desktop. Pero, si cerraramos la terminal y volvieramos a abrirle, el alias ya no estaria en efecto. Para que el efecto sea permanente, tenemos que incluir el alias en un fichero de configuración de la shell. Ese fichero estará en la carpeta home y se llamará .bashrc si usas Bash o .zshrc si usas Zsh. Y podemos escribir al fichero desde la terminal con el comando echo.

bash
echo "alias cddk='cd ~/Desktop'" >> ~/.zshrc

Pero también podemos abrir el fichero en algún editor de texto. Los alias son muy utiles para facilitar tareas rutineras, por ejemplo, podemos asignar los siguente aliases ga='git add', gc='git commit' cuando usamos git para control de versiones de software.

🪄 Trucos

La practica y fluidez en el uso de la CLI viene con la practica, pero hay muchos tips que podemos utilizar para facilitar y ahorrar tiempo.

Cycle commands

La terminal guarda un historico de los comandos que ejecutaste, si quieres volver a encontrar un comando, puede navegarles utilizando las flechas ↑ ↓.

También puedes verles como un listado usando el comando history.

Si no te acuerdas completamente del comando o hace mucho que lo usaste, puedes hacer una busqueda. Pulsa Ctrl + r y empieza a escribir cualquier parte del comando.

Auto complete

En general, las terminales permiten el uso del TAB, , para auto-completar los comandos, nombres de directorios y ficheros. De esa manera con pocos caracteres y el uso del tab ya tenemos todo listo!

🤙🏻 Ejemplos molones y prácticos

Haz hablar a tu ordenador

El comando 'say' es exclusivo de macOS. En otros sistemas, puedes instalar 'espeak' o otro TTS (Text-to-Speech)

Ese programa es muy sencillo, simplemente pongale seguido de una frase y disfruta. La voz puede customizarse con la opción -v. Para ver todas las voces instaladas, use el comando say -v '?'

Aunque por si solo pueda no parecer mucho, puedes utilizar say e integrarlo a tus programas para una interfaz más ' humana'.

Vaquita de la suerte

Hay 3 tres programitas interesantes y que pueden ser todavía más cuando les combinamos. Los links para instalación están en las referencias al final.

Hemos visto el comando cat, pero y lolcat?

Ese nuevo comando hace exactamente lo mismo que el anterior, pero con colorines.

El segundo comando es el fortune, que simplemente te da una cita o frase aleatoria. Si en algun momento necesitas algo de inspiración, puedes buscar la suerte en tu terminal.

Y por ultimo, un clasico inalgurado en el 1999, el cowsay. Todo mola más cuando se lo dice un animalito hablante

bash
cowsay ______________________ < CODE. REPEAT. ENJOY. > ---------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||

El combo fortune | cowsay | lolcat es la sabiduria bovina.

Modificar imágenes en lote

Imaginate que necesitas cambiar el tamaño a miles de imagenes, sea para thumbnails en una web o para algun proyecto de computer vision. Que trabajo sería abrirlas una a una en photoshop...

Para eso (y muchas otras operaciones sobre imagenes) está el ImageMagick, cuyo comando es mogrify.

Puedes hacer todo lo que harias con photoshop directamente de la terminal, por ejemplo:

bash
mogrify -resize 800x600 core.png

Huye de los pop-ups, anuncios y otras molestias

Nos ha pasado a todos, queremos descargar un video de youtube, buscamos una de las mil paginas iguales que prometen hacer lo mismo, eligimos una y esperamos que funcione. Para hacerlo simple, hazlo directo de tu terminal con youtube-dl.

Lo mismo con verificar la velocidad de nuestra internet. Resulta que el proprio Speedtest tiene una versión CLI!

Si quieres, puedes huy por completo de los navegadores!!! Bueno, en realidad, no. Pero si algun día quieres impresionar a un colega prueba buscar algo en Google directamente de la terminal con w3m.

Monitoriza tus procesos y procesadores

En lugar de abrir el monitor de actividades, si quieres ver de manera visual y rapida como están actuando cada uno de los núcleos de tu ordenador, usa el comando htop, la versión mejorada de top que viene por defecto.

☝🏻 Haz tu terminal TUYA.

Lo mejor para dominar la terminal es usarla! Necesitas cambiar unos ficheros de lugar, hazlo por la terminal. Quieres borar unos documentos, igual. Al principio puede parecer un camino más largo, pero esos pequeños ejercicios daran frutos en tus habilidades. Y no os olvidéis que el uso de la terminal es una habilidad esencial para desarolladores, programadores, data scientists.

Pero lo mejor para poder usar la terminal es hacerla más personal para ti, así que

🎨 Personaliza la terminal

Hay muchas maneras de customizar la terminal, no solo para dejarla más bonita, sino como para facilitar el trabajo.

Una de ellas ya la hemos visto, los alias. Cuando haya algun comando o proceso que uses mucho, hazle un alias! Ese pequeño ahorro de tiempo va acumulandose.

Si usas macOS, puedes instalar iTerm2 como alternativa a la terminal por defecto. Se agradece el cambio, pues te dará más posibilidades de configuración. Si tienes Linux, aunque haya alternativas, la terminal por defecto es super! En Windows, tendras que buscar una de las alternativas citadas anteriormente para tener una terminal bash o zsh.

Uno de los frameworks más populares es Oh My Zsh, con muchos plugins y muchos temas, el más popular es el agnoster, aunque otro genial (y mi favorito) es el Powerleve10k, que tiene muchas configuraciones.

text
Web devs, quizas queráis mirar Hyper, una alternativa a la terminal completamente customizable con HTML y CSS. 😉

Investiga los ficheros de configuración (.zshrc y .bashrc). Empieza con pequeños cambios como crear aliases, etc. Y con ayuda de internet podrás descubrir cada vez más posibilidades.

Utiliza los recursos de internet, si se te ocurre algo, lo más probable es que lo haya pasado a alguien antes y habrá recursos en internet. Y, por supuesto, Code. Enjoy. Repeat.

Referencias