¿Por qué migrar de Bash a zsh?

Como devs pasamos mucho tiempo en la consola: ya sea porque usamos el CLI de alguna herramienta o tecnología, o nos conectamos vía SSH a otro servidor, o incluso si programamos en terminal con Vim o Emacs.

Por lo tanto, podemos hacer que esa experiencia sea lo más agradable posible. El shell estándar por muchísimos años ha sido BASH, pero ha quedado muy atrás en términos de experiencia frente a otras alternativas. Por lo tanto, en este documento vamos a hablar brevemente de una alternativa que ya hace años se está imponiendo como el estándar: ZSH.

Antes de empezar, adjunto capturas como para tener un primer vistazo de ambos y poder compararlos:

zsh

zsh nació como una shell interactiva en 1990, diseñada por Paul Falstad, un estudiante de Princeton para tener una alternativa más amigable a Bash. De hecho, su nombre proviene de Zhong Shao, un profesor que tuvo Falstad en la universidad, ya que consideró que su login name, zsh, era muy bueno como nombre de una shell.

La palabra clave para entender las ventajas de zsh por sobre Bash es “interactiva”, ya que sus principales bondades tienen que ver con que es más fácil interactuar con ella que su contraparte en Bash. Algunos ejemplos:

Autocompletado interactivo (usando TAB y flechas)

Una de las funcionalidades que más me gusta es poder usar TAB y las flechas del teclado para interactuar y poder seleccionar más fácilmente, valiéndose del autocompletado de comandos.

Autocompletado con interacción de teclado para seleccionar opción.

Autocompletado de comandos (usando flechas UP y DOWN para navegar)

Algo muy útil, que también existe en Bash pero no de una manera tan intuitiva, es la posibilidad de utilizar el historial de comandos para volver a usarlos. Utilizandos las flechas del teclado podemos navegar por los últimos comandos a medida que escribimos.

Autocompletado de comandos navegando historial.

Uso de wildcards para paths

Con zsh podemos usar wildcards para detectar archivos y procesarlos. En el siguiente ejemplo, contamos la cantidad de líneas de todos los archivos con extensión .tsx dentro de un directorio.

Uso de wildcards en comandos.

Además de lo anterior, zsh tambiénpermite personalizar fácilmente la consola al estilo de un IDE para hacerla más amena. Por otra parte, podemos agregar información contextual, como versionado de Git, path actual, usuario, y hora, entre otras muchas cosas.

Oh My Zsh

Oh My Zsh is an open source, community-driven framework for managing your zsh configuration.

Sounds boring. Let’s try again.

Oh My Zsh will not make you a 10x developer…but you may feel like one.

Finalmente, el mejor framework en mi opinión para trabajar con zsh es Oh My Zsh, desarrollado por la gente de Planet Argon (si no lo conocen, es una empresa consultora de Ruby on Rails, que ha desarrollado varios proyectos open source y contribuyen frecuentemente al código fuente de Rails).

La instalación es sencilla, y la ventaja es que ofrece rápidamente integrar muchos plugins que añaden autocompletado de herramientas y comandos conocidos, a la vez que diversos alias para escribir menos en cada comando.

También tiene soporte para varios temas de personalización visual, que permiten ajustar la shell de forma muy flexible.

Creo que la mejor forma de venderlo es como enuncian en su README:

Once installed, your terminal shell will become the talk of the town or your money back! With each keystroke in your command prompt, you’ll take advantage of the hundreds of powerful plugins and beautiful themes. Strangers will come up to you in cafés and ask you, “that is amazing! are you some sort of genius?”

Finally, you’ll begin to get the sort of attention that you have always felt you deserved. …or maybe you’ll use the time that you’re saving to start flossing more often. 😬

Conclusión

Usar zsh hace de la experiencia de uso algo muchísimo más agradable y eficiente, y tiene la ventaja de que se instala muy fácilmente y que es completamente compatible con todo lo que ya usamos y conocemos de Bash. A su vez, Oh My Zsh lo hace aún más fácil y personalizable, exprimiendo al máximo la capacidades de la shell.