Pásate a ZShell ¿Por qué parecerte a la mayoría?

Maikel Llamaret Heredia Leído 243 veces Aplicaciones Shell ZShell

Seguimos generando contenido en nuestro Blog y poco a poco vamos subiendo la parada para los linuxeros que nos siguen. Hoy hablaremos de Shells, específicamente ZShell. Hace poco más de un año hice un cambio radical en mi manera de interactuar con el terminal en la distro de turno (y de hecho Manjaro es la distro de turno hace un año). Bash había sido mi Shell desde mi llegada a GNU/Linux pero por alguna razón decidí probar algo nuevo y ZShell me enamoró de tal manera que hasta hoy día no he vuelto a probar Bash.

Seguramente casi todo el que lee este humilde Blog usa sistemas operativos libres, principalmente alguno que use como Kernel a Linux o algún miembro de la familia BSD. Una de las grandes potencialidades de estos sistemas es el gran regalo divino de poseer una shell o intérprete de comandos. Mediante las instrucciones que aporta el intérprete, el usuario puede comunicarse con el núcleo y por extensión, ejecutar dichas órdenes, así como herramientas que le permiten controlar el funcionamiento de la computadora.

Ya se que a la mayoría de novatos les espanta la terminal, tranquilos, con el tiempo llegerán al punto de no poder vivir sin ella.

Viajando a nuestros orígenes UNIXeros, no podemos dejar de mencionar a Bourne shell que fue el shell usado en las primeras versiones de Unix y se convirtió en un estándar de facto; todos los sistemas similares a Unix tienen al menos un shell compatible con el Bourne shell.

Los shells pueden dividirse en cuatro categorías: tipo Bourne, tipo consola C, no tradicional e histórica. A nosotros nos interesan fundamentalmente los derivados de Bourne Shell. En el caso de las distribuciones GNU/Linux, en su inmensa mayoría usan Bash shell, compatible con Bourne, de manera predeterminada.

Y hablando de Bourne como shell primitiva de Unix, aprovecho y les dejo un breve listado de sus descendientes más promisorios:

  • Bourne shell (sh) — Escrita por Steve Bourne, cuando estaba en Bell Labs. Se distribuyó por primera vez con la Version 7 Unix, en 1978, y se mejoró con los años.
  • Almquist shell (ash) — Se escribió como reemplazo de la shell Bourne con licencia BSD; la sh de FreeBSD, NetBSD (y sus derivados) están basados en ash y se han mejorado conforme a POSIX para la ocasión.
  • Bourne-Again shell (bash) — Se escribió como parte del proyecto GNU para proveerlo de un superconjunto de funcionalidad con la shell Bourne.
  • Debian Almquist shell (dash) — Dash es un reemplazo moderno de ash en Debian.
  • Korn shell (ksh) — Escrita por David Korn, miestras estuvo en Bell Labs.
  • Zshell (zsh) — Considerada como la más completa: es lo más cercano que existe en abarcar un superconjunto de sh, ash, bash, csh, ksh, y tcsh.

No se a ustedes, pero cuando leí que Z shell era considerada la más completa me pregunté porqué no pasar de Bash a Zsh y en menos de 2 minutos di el cambiazo y parece que será por un buen tiempo o para siempre:

Mi Yakuake con ZShell
Mi Yakuake con ZShell

La primera versión de zsh fue escrita por Paul Falstad en 1990, cuando era estudiante en la Universidad de Princeton. Zsh se diseñó para poder usarse interactivamente. Se le han incorporado muchas de las características principales de otras shells de Unix como, bash, ksh, o tcsh y además posee características propias originales. El nombre zsh procede del profesor de Yale Zhong Shao, por entonces profesor asistente en la Universidad de Princeton. Falstad pensó que su nombre de inicio de sesión, “zsh”, era un buen nombre para una shell.

De todas las shells disponibles en las distribuciones más importantes, solamente la Friendly Interactive Shell (fish) es comparable en términos de funcionalidades para el usuario medio.

Como ocurre con Bash y muchas otras shells, zhs posee funcionalidades como prompts personalizables y terminaciones de la línea de comandos. Sin embargo, pocas shells poseen la variedad y versatilidad de zsh, e incluso algunas pueden alardear de funcionalidades comparables al corrector ortográfico incorporado de zsh o su capacidad para compartir historias con shells que se ejecutan.

Seleccionando y configurando Z shell

Muchas distribuciones incluyen distintas shells por defecto debido a que ocupan poco espacio. En otras distros tendremos que instalar zsh separadamente. Para ver si se encuentra ya instalada, miramos para comprobar que /usr/bin/zsh se encuentra listada cuando ejecutamos el comando less /etc/shells.

En el universo de distros GNU/Linux al ejecutar el comando echo $SHELL en el prompt del terminal, en la mayoría de los casos encontraremos que estamos ejecutando /bin/bash. Si deseamos cambiar a zsh de forma permanente, En Debian y derivados podemos usar:

sudo apt install zsh
chsh --shell /usr/bin/zsh

Sustituye el comando apt install por el método de administración de paquetes de tu distribución.

Luego reiniciamos el servidor X o simplemente cerramos nuestra sesión y volvemos a loguearnos. Si por algún motivo deseas regresar a bash como shell predeterminada basta con ejecutar:

chsh --shell /bin/bash

Ahora cuando abras tu emulador de terminal (konsole, xterm o cualquier otro), verás que has perdido las configuraciones que tenías para tu usuario. Esto se debe a que zsh no utiliza el archivo ~/.bashrc pero nos permite configurar de un modo increíblemente eficiente cada detalle del shell.

Intentaré describirles algo de la configuración, pero es tan rico en opciones que lo mejor es que lo prueben ustedes mismos.

Cuando se configure zsh, se tendrá en cuenta cuatro posibles elecciones principales (ver imagen anterior). De ellas, la más fácil es pulsar 2, que acepta las configuraciones zsh predeterminadas. Sin embargo, pulsando 1, no sólo podemos establecer todo según nuestras preferencias, sino comenzar a obtener un sentido de las funcionalidades de zsh.

Si te decantaste por la opción 1 de la imagen más arriba, entonces llegarás a una nueva ventana de configuración. En este punto, si seleccionamos 1 podemos ajustar el número de pasos en el historial de zsh y el nombre del fichero en el cual se guardan estos pasos. Pulsando 2 podemos volver a activar la finalización o a desactivarla y crear el fichero inicial requerido. De manera similar, pulsar 3 nos permite establecer si el editor integrado zsh emula la combinación de teclas de Emacs o de Vi.

Sin embargo, si pulsamos 4 podremos configurar algunas de las opciones más útiles. En particular, podemos establecer que zsh cambie directorios cuando los introducimos en una ruta sin un comando (autocd) o añadir nuevas líneas del historial en lugar de sobreescribir las que ya existen (appendhistory).

Esta herramienta de configuración tiene unas cuantas excentricidades que te hacen convencerte de que realmente zhs es la Shell más versátil que puedas encontrar para sistemas UNIX-Like, aunque no hay nada difícil de entender si nos tomamos el tiempo suficiente.

Cuando trabajamos, lo más probable es que queramos tomar notas de algunas de las instrucciones de la pantalla, como puede ser el uso del comando compinstall para habilitar la terminación avanzada. Cuando hemos finalizado las opciones de configuración, pulsamos 0 para guardar nuestros cambios.

Luego de esta configuración inicial, podrás volver a cambiar tus configuraciones en cualquier otro momento usando la siguiente línea de comandos:

zsh /usr/share/zsh/functions/Newuser/zsh-newuser-install -f

Entonces nos saldrá algo como esto:

Todo primerizo debería pasar por este proceso
Todo primerizo debería pasar por este proceso

La ventaja principal de zsh es que cuenta con infinitas opciones avanzadas para personalizar el comportamiento de sus funcionalidades. El método más básico para configurar estas opciones es añadiendo manualmente el fichero ~/.zshrc. Si utilizamos este método, al menos deberemos prestar atención a los avisos y evitar sobrescribir las líneas marcadas como alteradas por el programa de instalación (colocar nuestras propias ediciones por encima o por debajo de esas líneas). Cuando nos sentimos más cómodos con opciones zsh, podemos tomar este aviso con menos seriedad, pero editar las líneas añadidas automáticamente es una buena manera de meternos en problemas con zsh. Para algunas opciones, tales como prompts personalizados, no tenemos más opción que editar .zshrc.

El principal archivo de configuración de zsh por usuarios es ~/.zshrc. Algunos parámetros de configuración de ~/.bashrc pueden ser reutilizados en ~/.zshrc. En mi caso particular, luego de configurar pacientemente el funcionamiento de zsh en mi sistema, para hacerlo mucho más funcional, añadí algunas cosillas que usaba en bash, como mis necesarios alias, figlet y fortunes.

El segundo modo y más fácil de editar el fichero de configuración zsh es usando el comando setopt. La sintaxis de este comando es menos formal que la mayoría de los comandos y está seguido de una opción que suele aparecer habitualmente en letras mayúsculas con subrayados por espacios en la documentación zsh.

Tomando en cuenta que muchos de nosotros ya estamos familiarizados con Bash, se deduce que ya conocemos muchas de las funcionalidades y comandos en zsh. Sin embargo, debemos estar preparados para muchas mejoras.

Por ejemplo, tomar la personalización del prompt det terminal con zsh. En Bash las cosas son un poco diferentes y una de las cosas que me desilusionó fue el prompt demasiado sencillo aparentemente de zsh. Luego de unos minutos analizando y leyendo me di cuenta que todo eran ventajas al extremo de permitirme configurar un prompt a la izquierda (el normal de toda la vida) y uno al mismo nivel pero a la derecha. Por ejemplo si en tu archivo ~/.zshrc declaras lo siguiente...

PROMPT="%n@%m %d~ > "
RPROMPT=""

... entonces tendrás un prompt a la izquierda con tu nombre de usuario, nombre de host y tu ubicación actual, además tendrás un prompt a la izquierda con la hora del sistema.

Por otro lado, si estamos familiarizados con las funciones del historial de Bash, encontraremos muchas de ellas en zsh. Sin embargo, a través de setopt podemos personalizar el historial de zsh para una extensión más grande que en Bash. Para comenzar, podemos ajustar cómo el historial zsh va a controlar las entradas duplicadas, añadiendo HISTIGNORE ALLDUPS para ignorarlas, HIST EXPIRE_DUPS_FIRST para tener entradas duplicadas sobrescritas antes que únicas o HIST_SAVE_NO_DUPS para tener duplicados automáticamente desparramados.

Quizás la opción del historial más útil en zsh es SHARE_HISTORY. Cuando habilitamos este comando, cada vez que un elemento se añade al historial zsh comprueba si cualquier otra shell ha ejecutado un comando desde el último ejecutado en la shell actual. Si esto ocurre, se añade una grabación de dicho comando al historial de la shell, permitiendo que vayan a parar al historial todos los comandos de cuantas shells estén abiertas para tu usuario al mismo tiempo, algo que en Bash a veces se complica o personalmente nunca pude resolver.

Resumiendo

Realmente solo les he dejado una pincelada, pero incluso mientras escribo este artículo y voy haciendo pruebas voy descubriendo funcionalidades y ventajas de zsh que permiten darnos cuenta de porqué es considerado uno de los shells derivados de Bourne más versátil. Si quieres investigar más sobre este fabuloso intérprete de comandos, puedas instalar los paquetes zsh-doc y zsh-lovers (esos son los nombres en Ubuntu, en otras distros podrían cambiar o no estar presentes). Por otro lado, en la Red de Redes sobran manuales que nos facilitan el rápido aprendizaje y adaptación a esta nueva y mejorada experiencia. También me he dado cuenta, leyendo la Wiki de Archlinux, que en Github hay más de un desarrollador que comparte excelentes preconfiguraciones de Z Shell que la elevan a niveles inimaginables.

Luego de leer un poco la documentación que tenía a mano, terminé en pocos minutos incluyendo resaltado de sintaxis, garantizando así que la propia terminal me indique un cambio de coloración de texto cuando el comando esté bien escrito. Por otro lado mejoré varias cuestiones relacionadas con la gestión del historial de comandos ejecutados y otros cuantos detalles más. Se vuelve muy productivo el hecho de no tener que usar comando alguno para funciones tales como desplazarse desde tu ubicación hacia cualquier directorio de los sistemas de archivos montados, basta con escribir la ubicación (adiós cd).

En posteriores artículos veremos la maravillas del scripting en zsh. Y debo terminar diciendo que

La curva de aprendizaje no es tan horrorosa como parece.

Por hoy es suficiente, espero le sirva a más de uno y que dejen sus impresiones y experiencias en los comentarios.

Si instalas fizsh (no confundir con fish, una shell que veremos luego) podrás convertir a Z Shell en algo más potente y sobre todo, más sencillo de usar… En un futuro irán cayendo tips sobre esta nueva Shell que parece haber llegado para quedarse en mis sistemas UNIX_Like.





Acerca del Autor
Maikel Llamaret HerediaMaikel Llamaret Heredia: Creador y actual Mantenedor del Proyecto SWL-X. Desarrollador y diseñador Web. Cofundador de Web & Media Integrated Solutions. Con más de 10 años de experiencia en la administración de sistemas GNU/Linux. Actualmente uno de los administradores de la Web del Grupo de Usuarios de Tecnologías Libres en Cuba.

Blog Comments powered by Disqus.

Entrada Anterior Siguiente Entrada