Pasando de Bash a Zshell

Este 2016 que ya va por 4 meses recorridos he decidido hacer un gran cambio en mis sistemas GNU/Linux pasando de Bash a ZShell como intérprete de comandos. De vez en cuando es bueno dejar cosas viejas atrás y experimentar con nuevas herramientas. Muchos aprovechan y según sus posibilidades hacen cambios tales como comprar nuevas prendas de vestir, nuevos gadgets tecnológicos y hasta hay algunos un poco más nerds que deciden dejar de lado su antigua shell y cambiar a experiencias nuevas. En mi caso, he decidido, repito, dejar a mi viejo amigo Bash Shell y retarme a usar un nuevo shell, dando la bienvenida a Z Shell (zsh) y no me ha defraudado hasta el momento.

Muchos seguidores del extinto Blog SWL-X ya leyeron este post, o al menos uno muy parecido, pero lo traigo para GUTL para que no se pierda esta valiosa info, junto a otras que irán cayendo en la medida de mis posibilidades.

La inmensa mayoría de quienes nos leen en GUTL usan 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 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.

Remontándonos 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.
  • Z shell (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="<%t >"

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 HIST_IGNORE_ ALL_DUPS 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 (adíós cd). Aún estoy en empapándome un  poco para luego pasar a lo más bello de este asunto: el scripting en zsh, pero creo que la curva de aprendizaje no es tan horrorosa como pensé.

De momento mi archivo  ~/.zshrc quedó de la siguiente manera:
# Lines configured by zsh-newuser-install
HISTFILE=~/.histfile
HISTSIZE=5000
SAVEHIST=5000
setopt appendhistory autocd beep extendedglob nomatch notify
bindkey -e
# End of lines configured by zsh-newuser-install
# The following lines were added by compinstall
zstyle :compinstall filename '/home/maikel/.zshrc'
autoload -U compinit promptinit
compinit
promptinit
autoload -U colors && colors
# End of lines added by compinstall
setopt appendhistory
setopt incappendhistory
setopt hist_reduce_blanks
setopt histignorealldups
setopt correct
zstyle ':completion:*' rehash true
export ZSH=$HOME/.oh-my-zsh
ZSH_THEME="pure"
export CHEATCOLORS=true
source /usr/share/zsh/plugins/zsh-history-substring-search/zsh-history-substring-search.zsh
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source /usr/share/zsh/plugins/ubuntu/ubuntu.plugin.zsh
source /usr/share/zsh/plugins/colored-man-pages/colored-man-pages.plugin.zsh
source /usr/share/zsh/plugins/colorize/colorize.plugin.zsh
source /usr/share/zsh/plugins/command-not-found/command-not-found.plugin.zsh
source /usr/share/zsh/plugins/zsh-navigation-tools/zsh-navigation-tools.plugin.zsh
source /usr/share/zsh/plugins/themes/themes.plugin.zsh
autoload -U run-help
autoload run-help-git
autoload run-help-svn
autoload run-help-svk
alias help=run-help
figlet -c -f standard SWL-X
fortune debian-hints
# alternate prompt with git & hg
PROMPT=$'%{\e[0;34m%}%B┌─[%b%{\e[0m%}%{\e[1;32m%}%n%{\e[1;30m%}@%{\e[0m%}%{\e[0;36m%}%m%{\e[0;34m%}%B]%b%{\e[0m%}-%b%{\e[0;34m%}%B[%b%{\e[1;37m%}%{\e[0;33m%}%B%d]%b%{\e[0m%}-%{\e[0;34m%}%B[%K{blue}%{\e[1;37m%}'%D{"%A %d de %B de %Y %I:%M"}%b$'%{\e[0;34m%}%B%k]%b%{\e[0m%}
%{\e[0;34m%}%B└─%B[%{\e[1;35m%}%$(Ubuntu)%{\e[0;34m%}%B]%{\e[30m%}%b '
PS2=$' \e[0;34m%}%B>%{\e[0m%}%b '
function mkdircd () { mkdir -p "$@" && eval cd "\"\$$#\""; }
manpath=($X11HOME/man /usr/man /usr/lang/man /usr/local/man)
export MANPATH
#Aca van mis ALIASES que no te los pongo para ahorrar espacio y que no seas chismoso

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.

¿Te resultó interesante? Compártelo ...



Maikel Llamaret Heredia

Publicado por Maikel Llamaret Heredia

https://swlx.info » Facebook » Twitter » Google+ » Linkedin » Forma parte de GUTL desde el 6 diciembre, 2011. Parte de la familia GUTL. Usuario de Tecnologías Libres desde hace varios años. Fiel a GNU/Linux y las filosofías del Software Libre y el Código Abierto. Linux User # 587451. Creador y actual mantenedor del Proyecto SWL-X. Freelancer dedicado al Desarrollo / Diseño Web y Marketing Online. Creador de Web & Media Integrated Solutions

Este artículo tiene 15 comentarios

  1. Tremenda Shell, plagada de funcionalidades. Aunque debo confesar que sigo con Bash. Realmente son muy pocas las cosas que hago en consola y Zshell era como mucho para mi. Estaba usando Oh my Zsh.

    Para los que usan la consola mucho tiempo creo que es la mejor alternativa a Bash, aunque dicen que Fish es igual o mejor que Zsh.

      • Es que realmente no siento que a Bash le falte algo, hasta ahora todo lo que hago con la consola lo soluciono sin problemas con ella 😉

        • Yo también pensaba que a Bash no le faltaba nada, hasta que probé ZShell y gracias a este fabuloso y completo intérprete de comandos es que supe todo lo que le faltaba a Bash 😀 . Ahora me cuesta trabajar con Bash, es como si me faltara oxígeno…

  2. He tenido una experiencia semejante a la suya, leí una muy buena recomendación en la red y me decidí a probar suerte, ahora no creo que vuelva atrás. Las facilidades que te ofrece con un poco de cosmética hacen de zsh difícil de soltar.

    Esta es mi consola GNOME con la herramienta oh_my_zsh y el tema powerlevel9k

    Saludos..

  3. Como soy gordo y barbudo, uso bash, Leyendo me vi abriendo una pestaña al navegador y buscando cosas de zsh, luego abrí mi prompt de bash y se me pasó 😀

Los comentarios están cerrados.