featured image

Hace poco encontré por casualidad esta nueva shell: fish. Según su web y slogan es una consola de línea de comandos de los 90s. ¿Le echamos un vistazo?

Una de las cosas que más me gustó es la cantidad de características que trae preinstaladas. A diferencia de bash y otras que requieren de plugins para poder realizar cosas similares.

Además, dejo esta imagen para que podáis ver la ejecución con el tema que actualmente uso:

Características

Según la web y lo que he podido ir probando las características son las siguientes:

1.- Autosugerencias. Esto no se queda solo ahí. Mientras escribes se muestra la última entrada que hayas escrito comenzando por esas letras. Si presionas la flecha derecha se completa y puedes usarlo. Pero hay más. Si escribes un comando se colorea de formas diferentes según si se encuentra el ejecutable o no y puedes usar la flecha arriba y abajo para navegar entre las sugerencias de las veces que has usado ese comando.

2.- Colores. No bueno, esto sería en plan... ¡¡¡Colores!!!, si os fijáis en la captura del tema Terran (sacado de Starcraft) veréis que no es solo los colores, son composiciones con bastante trabajo y buen acabado. Se colorean los comandos, los textos entre comillas, los argumentos, todo tiene su color.

3.- Autocompleción. Sí, muchos dirán... ¡eh! eso ya está en bash ... pero no de esta forma. Si presionas el tabulador obtendrás sugerencias... pero si lo presionas dos veces, puedes navegar entre esas sugerencias con los cursores y elegir la opción que quieras. Además, las opciones de los comandos los ofrece con un extracto de man para que no solo veas las opciones sino también la ayuda de cada uno de los parámetros.

4.- Fish Scripting. No sé si habéis desarrollado en bash, es un lenguaje scripting al estilo C, imitando a Perl, pero aún de más rara escritura. Fish se aleja de esto un poco y permite realizar scripts más legibles. Además, si los escribes en la consola, la consola se va autoindentando para que veas correctamente estos scripts. Simplemente genial.

5.- Temas y Extensiones. Dispone de un modo de configurar y agregar extensiones y temas muy fácil. Comentaré más abajo cómo llegar a tener la interfaz tal y como la tengo configurada para mostrar lo fácil que resulta.

Para poder entenderlo hay que usarlo. Al ser una shell puedes instalarla en tu sistema y emplearla cada vez que quieras probar y jugar un poco. Por lo que vamos a ver...

Instalación de la Shell

La web expone varias formas de realizar la instalación. Por ejemplo, si usas Mac tienes la posibilidad de instalarlo a través de homebrew:

brew install fish

Si usas GNU/Linux tienes otras opciones para instalar el repositorio de paquetería y así instalar con tu gestor de paquetes fish.

Está disponible para Debian, Ubuntu, CentOS, Fedora, OpenSuSE, RedHat Enterprise Linux, entre otros.

Para Windows puedes instalarlo si dispones de la instalación previa de Cygwin o MSYS2.

Fisher y Oh My Fish!

Hay dos frameworks disponibles en fish. Siempre instalo ambos para poder disponer de más opciones a la hora de buscar una extensión o configurar el sistema. Estos son fisher y oh-my-fish.

El primero permite instalar el tema Terran y el segundo permite muchas extensiones y configuraciones. Instalaremos ambos:

curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fishe
r

Este comando puede encontrarse en la web de fisher. Una vez lo ejecutemos tendremos disponible el comando fisher. Podemos ejecutarlo de la siguiente forma:

fisher ls-remote

Esto nos mostrará todas las extensiones disponibles. Tenemos extensiones para trabajar con Docker, Ansible, Git, Node.JS, Python con virtualenv, Ruby con Rbenv y RVM, AutoJump, Boss, Z, ... las extensiones pertenecen a un repositorio en github por lo que irán apareciendo más conforme se publiquen más.

Además, si instalamos oh-my-fish obtendremos el listado de extensiones que proporciona este otro framework. Su instalación según su web es como sigue:

curl -L https://get.oh-my.fish | fish

Esta extensión agrega el comando omf pero podemos usar fisher para instalar sus extensiones también. Las extensiones de que dispone nos permiten atajos para trabajar con Android SDK, Archlinux, Homebrew, ccache, composer (PHP), Django, Amazon EC2, Emacs, gem (Ruby), git-flow, PHP, Rails, SSH, Sublime y muchos temas y extensiones más.

Al igual que con fisher el framework de oh! my fish tiene su propio repositorio y va agregando nuevas extensiones poco a poco.

Al lío... Instalando Terran!

Si ya tienes fish instalado y las extensiones fisher y oh! my fish solo queda agregar la fuente Source Code Pro. Esta fuente es ideal para consola. Tiene muchos símbolos además de una letra muy bien definida. Es la que emplean la mayoría de temas de fisher.

Se puede instalar siguiendo las indicaciones de su web. En bash sería ejecutando esto:

brew tap caskroom/fonts && brew cask install font-source-code-pro

En GNU/Linux hay un issue en github que da unas instrucciones para instalarlas:

For system wide installation, copy the fonts to /usr/share/fonts and run sudo fc-cache to rebuild the font cache, or for user local installation, make sure ~/.fonts exists, copy them into there, then rebuild the font cache.

Básicamente copiar las fuentes a la ruta /usr/share/fonts o ~/.fonts en caso de querer las fuentes solo para el usuario local (o no poder instalarlas como root). Después ejecutar el comando fc-cache.

Una vez tengamos la fuente, solo hay que ejecutar:

fisher terran

El comando se encarga de instalar la extensión y cargar todo lo necesario. Cuando termine veremos en pleno funcionamiento el tema.

También hay otros temas bastante curiosos de imagen similar como: superman, stark, hulk, flash, ... puedes echar un vistazo a este listado online:

https://github.com/JorgeBucaran/awesome-fish#powerline-themes

Diferencias y problemas

Sí, no todo es color de rosa. Hay diferencias a tener en cuenta cuando vayamos a escribir scripts o simplemente a ejecutar en la línea de comandos algo.

Por ejemplo, algo como lo siguiente:

for i in `seq 1 10`; do
    [ "$i" -gt 5 ] && echo $(date) $i
done

Cambia bastante. En principio la ejecución de comandos para toma de valores se obtiene simplemente con paréntesis... así que cuidado con ellos. El símbolo && ya no puede ser usando hay que emplear and en su lugar. El código quedaría:

for i in (seq 1 10)
    if [ "$i" -gt 5 ]
        echo (date) $i
    end
end

O realizar algo cotidiano como:

make && make install

Se escribe como:

make; and make install

La colorización de sintaxis no obstante te ayuda a darte cuenta de cuándo lo estás escribiendo mal.

Hay solo un problema que encontré al intentar enviar a través de un pipe la salida de un comando docker y es que no se procesaba nada. Ante eso, vi en la web de fish (en los issues) alguien que le había pasado y descubrió que haciendo:

fish -c "comando | grep filtro"

Funciona. Por lo que es lo único que se sale un poco. No obstante, la velocidad que se consigue con extensiones como autojump merece la pena.

Conclusiones

Fish se ha hecho hueco entre las shells gracias a un cuidado aspecto una selección de potentes extensiones que facilitan la tarea diaria de los administradores de sistemas, programadores y devops en general. Muy recomendado.

¿Te animas a probarlo? ¿Has descubierto nuevas y mejores extensiones? ¿Otras shells con muchas más y mejores características? ¡Comenta y comparte!