Skip to main content

Potenciando el shell

A medida que nos volvemos más competentes, el terminal se convierte en una herramienta inevitable. Eventualmente, llegará un momento en que personalizar el terminal se convertirá en uno de los mayores impulsores de productividad. Simplificar el uso del terminal no solo facilitará las tareas diarias, sino que también hará el trabajo más agradable.

Con la cantidad de líneas de comando que utilizamos diariamente, es esencial transformar nuestro entorno principal en algo placentero. Después de todo, el terminal es donde pasamos una parte significativa de nuestro tiempo, y hacerlo más amigable puede marcar toda la diferencia en la eficiencia y en la satisfacción del trabajo.

Vamos a los conceptos iniciales. Los términos "Terminal" y "Shell" son frecuentemente usados en conjunto, pero se refieren a cosas diferentes.

El Shell actúa como un traductor. Interpreta los comandos de entrada y ejecuta operaciones correspondientes en el sistema operativo. Funciona como una capa intermedia entre el usuario y el sistema, permitiendo la interacción por medio de comandos de texto. Existen diversos tipos de Shell, siendo Bash (Bourne Again Shell) y Zsh (Z Shell) ejemplos comunes en sistemas basados en Unix/Linux. PowerShell es un shell popular en sistemas Windows.

Un terminal es un programa que ejecuta un Shell. Proporciona la interfaz (ventana) para interactuar con el Shell. Ejemplos de terminales en Linux incluyen Tilix, Alacritty, Terminator, Konsole, entre otros. En Windows, tenemos Windows Terminal y en macOS el iTerm2.

Hablando un poco de Linux, un conjunto que me gusta bastante es Tilix de terminal y Zsh como Shell.

Tilix ofrece una interfaz agradable, permitiendo la apertura de diferentes shells en pestañas separadas o incluso varios shells en una única pestaña. Un recurso particularmente útil es la capacidad de enviar un comando a varios shells simultáneamente, lo que se vuelve esencial al lidiar con varias máquinas que requieren comandos idénticos.

En cuanto a Zsh, es mi shell preferido. Posee una amplia gama de recursos, incluyendo plugins que facilitan el autocompletado de muchas herramientas usadas en el día a día. Al instalar Oh My Zsh y seleccionar un buen tema, la experiencia se vuelve prácticamente imbatible en comparación con otros shells disponibles.

Cualquier gestor de paquetes posee estas dos herramientas.

sudo apt-get install zsh tilix -y

# Define Zsh como tu shell por defecto
chsh -s $(which zsh)

# Verifica la instalación
zsh --version

Reinicia la máquina para que las configuraciones del nuevo Shell tengan efecto.

Haz un tour por Tilix y ajusta las configuraciones con tu preferencia de fuente, tamaño de letra, etc. Un consejo que me gusta mucho es utilizar Dracula como el tema de colores de Tilix y la fuente Meslo de Nerd Fonts que será instalada posteriormente.

mkdir -p ~/.config/tilix/schemes
cat <<EOF > ~/.config/tilix/schemes/Dracula.json
{
"background-color": "#282936",
"badge-color": "#FFFFFF",
"bold-color": "#FFFFFF",
"comment": "",
"cursor-background-color": "#000000",
"cursor-foreground-color": "#FFFFFF",
"foreground-color": "#F8F8F2",
"highlight-background-color": "#000000",
"highlight-foreground-color": "#FFFFFF",
"name": "Dracula",
"palette": [
"#000000",
"#FF5454",
"#50FA7B",
"#F1FA8C",
"#BD93F9",
"#FF79C6",
"#8BE8FD",
"#BFBFBF",
"#4D4D4D",
"#FF6E67",
"#5AF78D",
"#F4F99D",
"#CAA8FA",
"#FF92D0",
"#9AEDFE",
"#E6E6E6"
],
"use-badge-color": false,
"use-bold-color": false,
"use-cursor-color": false,
"use-highlight-color": false,
"use-theme-colors": false
}
EOF

Para cambiar al modo Dark en Tilix en preferences > Appearance > Theme variant y cambia a Dark. Para poner Dracula ve a Profiles > Default > Color TAB > Color Scheme y selecciona Dracula. Me gusta ajustar la transparencia al 15%.

Oh My Zsh es un framework que ayuda a gestionar las configuraciones de Zsh.

Para instalar:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Cada vez que ejecutemos Zsh él hará la lectura del archivo .zshrc en el home de tu usuario. Es en él donde configuramos todo lo que el Shell necesita para iniciar a nuestra manera.

ls -lha ~/.zsh*
-rw------- 1 david david 36K Mar 27 09:19 /home/david/.zsh_history # Guarda el Histórico
-rw-r--r-- 1 david david 3.8K Mar 26 23:17 /home/david/.zshrc # Las configuraciones de Zsh
-rw-r--r-- 1 david david 33 Dec 30 04:13 /home/david/.zshrc.pre-oh-my-zsh

La carpeta de Oh My Zsh también queda en el home de tu usuario.

ls -ha ~/.oh-my-zsh
. .editorconfig .github .gitpod.Dockerfile .prettierrc CONTRIBUTING.md README.md cache lib oh-my-zsh.sh templates tools
.. .git .gitignore .gitpod.yml CODE_OF_CONDUCT.md LICENSE.txt SECURITY.md custom log plugins themes

Vamos a configurar un tema para nuestro Shell. Este tema necesita estar dentro de la carpeta themes en Oh My Zsh. Mira algunos temas integrados de Oh My Zsh.

Un tema que me gusta bastante pero no es integrado es powerlevel10k. Vamos a descargar este tema y colocarlo dentro de la carpeta themes.

# Es necesario Git instalado. Si no tienes sudo apt-get install git -y
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

Edita el archivo ~/zshrc y ajusta el valor de la variable ZSH_THEME="powerlevel10k/powerlevel10k".

Si algún otro tema es elegido coloca el nombre del tema.

Este tema utiliza algunas florituras que son bien interesantes con la fuente Meslo instalada. Aprovecha y ya deja la fuente FiraCode instalada también para ajustar en Tilix si quieres utilizar.

git clone --depth 1 https://github.com/ryanoasis/nerd-fonts.git
cd nerd-fonts
./install.sh Meslo
./install.sh FiraCode
cd ..
rm -rf nerd-fonts/

Ahora vamos a configurar powerlevel10k. Evita llenar el terminal de informaciones innecesarias, pues más atrapalha que ayuda.

p10k configure
# Sigue los pasos

Esta configuración generará el archivo .p10k.zsh que será inyectado en tu .zshrc.

Cuando llegues a una configuración de shell ideal, guarda ese archivo para uso futuro para evitar hacer el configure nuevamente necesitando recordar todo lo que fue elegido.

Vamos a ajustar algunos detalles en el archivo .zshrc.

HITORY_STAMPS="dd.mm.yyyy" # Formato de la fecha
HISTSIZE=10000 # Aumentar el tamaño del histórico
HISTCONTROL=ignoredups # Ignorar duplicados en el histórico

Ahora vamos a añadir algunos plugins. Todo dependerá de con qué trabajes. Estos plugins generarán el autocompletado de las herramientas automáticamente y potenciarán el shell.

# Algunas herramientas no poseen plugins listos en Zsh para hacer el autocompletado y con este plugin podemos resolver ese problema. Un ejemplo es Terraform que posee el autocompletado, pero opentofu no.
git clone https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-completions

# Este plugin coloreará los comandos. Necesita ser el último de la lista que vamos a crear después.
sudo apt-get install zsh-syntax-highlighting -y
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git
echo "source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ${ZDOTDIR:-$HOME}/.zshrc

# Este plugin sugerirá comandos basados en tu histórico de comandos.
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

Ahora vamos a añadir los plugins que usaremos en .zshrc. Aquí está un ejemplo de los plugins arriba y algunos que uso diariamente. Haz tus elecciones basadas en tu día a día.

plugins=(
zsh-completions
zsh-autosuggestions
zsh-navigation-tools
git
aws
azure
kubectl
helm
kind
kubectx
kube-ps1
terraform
ansible
vagrant
docker
vault
podman
sigstore
websearch
zsh-syntax-highlighting
)

También es interesante añadir algunos alias para ganar velocidad en los comandos. Añade los más utilizados en tu día a día.

alias k="kubectl"
alias klog="kubectl logs"
alias kex="kubectl exec -it"
alias d="docker"
alias pod="podman"
alias dc="docker-compose"
alias vg="vagrant"
alias tf="terraform"
alias g="git"
alias update="sudo apt-get update"
alias upgrade="sudo apt-get upgrade -y"
alias install="sudo apt-get install -y"
alias ls="ls -lha"
alias journal="sudo journalctl -xeu"
alias status="sudo systemctl status"
alias restart="sudo systemctl restart"
alias reload="sudo systemctl daemon-reload"

¡Y tenemos nuestro resultado!

zsh tunado