El prompt es el carácter o conjunto de caracteres que se muestran en una línea de comandos para indicar que espera órdenes. Puede variar dependiendo del intérprete de comandos y suele ser configurable. En Bash el prompt se configura en la variable de entorno $PS1. Es posible definir un prompt personalizado modificando esta variable en el archivo de configuración individual .bashrc que se encuentra en el $HOME de cada usuario.

Hay infinitos tutoriales y ejemplos en Internet para configurar el prompt en Bash, por ejemplo: Bash Prompt HOWTO, Arch Wiki - Color Bash Prompt, y muchos más. Por eso no me voy a extender mucho en este tópico y simplemente voy a demostrar cómo marcar el estado o código de retorno del último comando ejecutado utilizando un emoticon, por ejemplo una cara de gato enojado, ideal para nuestros servidores en producción.

¿Cómo es posible agregar un emoticon en el prompt? Gracias a UTF.

Un poco de historia

ASCII (American Standard Code for Information Interchange), es un código de caracteres basado en el alfabeto latino. Fue creado en 1963 por el Comité Estadounidense de Estándares como una evolución de los conjuntos de códigos utilizados entonces en telegrafía. Un código de caracteres es un estándar para representar caracteres mediante valores numéricos binarios, por ejemplo en ASCII el número decimal 109 (6d en hexadecimal, 01101101 en binario) representa la letra m (eme minúscula).

A medida que la tecnología fue avanzando, se desarrollaron diferentes estándares y variaciones del código ASCII para facilitar la escritura de lenguas diferentes al inglés que usaran alfabetos latinos. Comúnmente se conocen como "ASCII Extendido".

Unicode es un estándar de codificación de caracteres diseñado para facilitar el tratamiento informático, transmisión y visualización de textos de múltiples lenguajes y disciplinas técnicas, además de textos clásicos de lenguas muertas. El término Unicode proviene de los tres objetivos perseguidos: universalidad, uniformidad y unicidad. Unicode define un conjunto de caracteres mucho más grande. Mientras que ASCII básicamente usa códigos de 7 bit, Unicode utiliza símbolos de longitud variable (en bytes). Además de representar muchísimos alfabetos y sistemas de escritura, Unicode posee símbolos, signos y emoticones.

Unicode posee diferentes formatos de codificación, como pueden ser UTF-8, UTF-16, UTF-32, etc. UTF-8 (8-bit Unicode Transformation Format) es un formato de codificación de caracteres Unicode e ISO 10646 utilizando símbolos de longitud variable. Está definido como estándar por la RFC 3629 de la Internet Engineering Task Force (IETF) y es uno de los formatos de codificación más utilizados en Internet.

Cómo determinar qué conjunto de caracteres utiliza Bash

En POSIX (Unix, Linux), para conocer qué conjunto de caracteres se está utilizando, se debe consultar el "locale". Un locale es un conjunto de parámetros que define el idioma, país y conjunto de caracteres. Para ello disponemos de la herramienta locale:

emi@hal9000 ~ 😈 $ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

Se observa que el formato de codificación utilizado para el conjunto de caracteres es UTF-8.

Manos a la obra

Ahora que sabemos que estamos utilizando UTF-8, podemos crear nuestro prompt Bash personalizado con emoticones.

Desde la página Emoticons (Emoji) — Unicode character table es posible copiar los emoticones apra utilizar en nuestro código.

En mi sistema, inicialmente el archivo .bashrc contiene el siguiente código:

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

Para modificar el prompt (variable $PS1), agrego las funciones "last_status" y "update_prompt", e inicializo la variable PROMPT_COMMAND, tal como se observa a continuación:

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

function last_status(){
    case $? in
    0)
        echo -e "😈"
    ;;
    1)
        echo -e "😕"
    ;;
    *)
        echo -e "😠"
    ;;
    esac
}

function update_prompt(){
    echo -e "\u@\h \W $(last_status) \$ "
}

PROMPT_COMMAND='PS1=$(update_prompt)'

 

La función "last_status" consulta el código de retorno del último comando ejecutado (variable $?), y en base a su contenido (0, 1, o mayor que 1) imprime diferentes emoticones. La función "update_prompt" define un prompt que incluye el emoticon. Los comandos \u, \h y \W imprimen el usuario actual, nombre de host, y directorio de trabajo actual respectivamente.

Finalmente, la variable PROMPT_COMMAND define un comando a ejecutar justo antes de imprimir el prompt.

Ejemplos

Con el .bashrc anterior, el resultado es el siguiente:

Si cambiamos los emoticones por caras de gatitos:

😺, 😼 y 😾

¡A jugar con el prompt!

Las posibilidades son infinitas. Si quisiésemos, por ejemplo, motrar la hora actualizada en el prompt, simplemente deberíamos utilizar el siguiente código:

function update_prompt(){
    echo -e "[$(date +%H:%M)] \u@\h \W \$ "
}

PROMPT_COMMAND='PS1=$(update_prompt)'

Espero que les haya gustado, al menos es una excusa para aprender un poco sobre Bash, conjuntos de caracteres, formatos de codificación, y locales.

Referencias

Bash Prompt HOWTO

Arch Wiki - Color Bash Prompt

Bash Prompt HOWTO: Chapter 4. External Commands - 4.1. PROMPT_COMMAND

Emoticons (Emoji) - Unicode character table


Tal vez pueda interesarte


Compartí este artículo

span style=