Conceptos Básicos de BASH: Introducción a BASH

¿Qué sucede cuando arrancamos e iniciamos sesión con variables y BASH, y cómo puedo personalizar el prompt BASH y el comportamiento de BASH? Tras analizar muchos comandos esenciales, es hora de hacer algo divertido. Cuando queremos subsistir a base de línea de comando, no está de más adaptarlos a nuestras necesidades. Para esto, primero tenemos que ver qué hace BASH cuando inicia sesión un usuario o cuando BASH se inicia al invocar un script.

BASH invocado como un shell de acceso interactivo

Este es el caso habitual cuando inicias sesión en el sistema mediante ssh, o tiene un terminal abierto sin una interfaz gráfica de usuario. Cuando se invoca BASH como un shell de acceso interactivo, primero lee y ejecuta los comandos de los siguientes archivos:

• /etc/profile, si existe el archivo. Después de leer este archivo, busca • ~/.bash_profile, • ~/.bash_login, y • ~/.profile, en este orden, lee y ejecuta los comandos desde el primero que existe y que es legible.

/etc/profile llama a /etc/bash.bashrc, de modo que hay uno más que añadir a la lista. Pero ~/.profile también arranca ~/.bashrc, así que este es el lugar donde tenemos que analizar todos los shells interactivos. Cuando un shell de acceso interactivo finaliza, o un shell de acceso no interactivo ejecuta el comando integrado exit, Bash lee y ejecuta comandos del archivo ~ /.bash_logout, si existe.

Invocado como un shell sin acceso interactivo

Cuando tienes una UI gráfica y abres una aplicación de terminal como mate-terminal o xterm, se ejecuta un shell sin inicio de sesión. Cuando se inicia un shell interactivo que no es un shell de inicio de sesión, BASH lee y ejecuta comandos desde ~/.bashrc, si ese archivo existe. La opción de archivo --rcfile obligará a BASH a leer y ejecutar comandos desde el archivo ~/.bashrc.

Invocado de forma no interactiva

Pensando en el nivel de detalle, esto es lo que sucede cuando ejecutas un script con BASH. Cuando BASH se inicia de forma no interactiva, para ejecutar un script shell, por ejemplo, busca la variable BASH_ENV en el entorno, expande su valor si aparece, y usa el valor expandido como el nombre de un archivo para leer y ejecutar.

En nuestro caso, el más importante es ~/.bashrc, ya que gestiona todos los shells interactivos de BASH. Si quieres que algo se ejecute solo una vez después de iniciar sesión, colócalo en /.profile. También podría usarse ~/bash_profile, pero no existe en Ubuntu.

El estándar para ambos serían añadir una función a ~/.bashrc, ya que quieres tenerlo siempre disponible:

### shows last installed packages from history
function apt-history(){

zcat -qf /var/log/apt/history.log* | grep -Po '^Commandline: apt install (?!.*--reinstall)\K.*'
}
Para la otra opción, añade algo como lo siguiente a la ruta a través de ~/.profile, que sólo lo quieres una vez para iniciar sesión:
$ export PATH="$PATH:/some/addition"
Esto evita una ruta que tiene :/some/addition como añadido cada vez que se invoca BASH. Si quieres ver todo lo que sucede con BASH y estos archivos en conjunto, puedes intentar:
$ PS4='+ $BASH_SOURCE:$LINENO:' BASH_XTRACEFD=7 bash -xlic "" 7>&2
No obstante, no te sorprendas por el volumen, y no te olvides de salir una vez más

Cambiar el prompt de BASH

Ahora es el momento de poner esto en práctica. Aunque el prompt estándar en color está bien, pero es mejor personalizando a nuestro gusto. Dirígete a bashrcgenerator.com y juega con las diferentes opciones.

Figure 1 - bashrc generator
Figura 1 – Generador bashrc

Tras arrastrar los elementos interesantes al cajón 2, aparecerá un montón de códigos escape en el cajón 4. Así es como BASH puede interpretar las diferentes variables y colores. El principio es similar al Unicode o HTML codificado como ASCII plano, simplemente con colores y propiedades de pantalla.

Los terminales modernos como mate-terminal o xterm tienen capacidad para 256 colores. Para verlos, guarda el siguiente script como 256colors.sh, hazlo ejecutable con chmod a+x y ejecútalo:

#!/bin/bash

for fgbg in 38 48 ; do # Foreground / Background
for color in {0..255} ; do # Colors
# Display the color
printf "\e[${fgbg};5;%sm %3s \e[0m" $color $color
# Display 6 colors per lines
if [ $((($color + 1) % 6)) == 4 ] ; then
echo # New line
fi
done
echo # New line
done

exit 0
Esto es lo que tu terminal es capaz de hacer. Ahora, en el sitio bashrcgenerator.com, puedes hacer doble clic en los elementos del recuadro 2 para ver los diferentes colores y resoluciones. Los códigos escape se generan en el recuadro 4. Tras encontrar una versión que te guste, copia el código del recuadro 4 y pruébalo en tu ventana de BASH pegándolo y presionando INTRO. Si estás satisfecho con el resultado, abre ~/ .bashrc con un editor de texto, busca la línea que empieza por PS1 = y reemplázala con la línea del recuadro 4, ¡pero sin la parte de exportación!

Personalmente, me gusta mantener un equilibrio entre tener algo corto, simple y discreto, y disponer de toda la información en el prompt, similar a un tablero de instrumentos:

Figure 2 - command prompt with PS1 example
Figura 2 – Prompt de comandos con el ejemplo PS1

Como puede ver, el prompt de root es diferente al prompt de usuario para así recordarme que tengo privilegios de root y potencialmente podría llegar a destruir mi sistema por descuido If you also want to have a prompt like this, looks for the following line:

if [ "$color_prompt" = yes ]; then
Si también deseas tener un prompt como este, busca la siguiente línea:
if [ $(id -u) -eq 0 ];
then # you are root, make the prompt red
PS1='${debian_chroot:+($debian_chroot)}\[\e[00;33m\]\u\[\e[00m\]@\[\e[00;34m\]\h\[\e[00m\]:\[\e[00;36m\]\w\[\e[00m\]\e[01;31m#\e[00m '
else
PS1='${debian_chroot:+($debian_chroot)}\[\e[00;32m\]\u\[\e[00m\]@\[\e[00;34m\]\h\[\e[00m\]:\[\e[00;36m\]\w\[\e[00m\]$ '
fi
Reemplaza todo lo que hay antes de la expresión else sin sangría unas pocas líneas hacia abajo. Ahora con el nuevo y reluciente prompt, queremos ir un poco más allá. ¿Qué más podemos hacer para personalizar nuestra experiencia con BASH?

Funciones de BASH

Como he mencionado anteriormente, puedes colocar funciones en el archivo ~/.bashrc. El ejemplo apt-history es una función que muestra los últimos paquetes instalados o eliminados. ¡Tras haber cambiado ~/.bashrc, no olvides cerrar la sesión e iniciar sesión de nuevo para que tus cambios tengan efecto! Simplemente asigna un nombre a la función, empieza con la función nombrefunción () y coloca tu código entre paréntesis.

Otro ejemplo divertido sería ofrecer el tiempo actual por consola. Puedes obtener el parte meteorológico actual por terminal haciendo curl wttr.in/YourCity, con el prefijo de dos letras como fr.wttr.in/Paris recibirás el parte meteorológico de París en francés.

Para ver todas las opciones, escribe el siguiente comando:

$ curl wttr.in/:help.

Resulta un tanto molesto escribir siempre todas las opciones; con una función puedes omitir todo ello y simplemente escribir "wttr" para obtener el clima actual de tu ubicación, en el idioma correcto y con todas las opciones que quieras:

function wttr()
{
# Seoul is the default location
curl -H "Accept-Language: ${LANG%_*}" wttr.in/"${1:-Seoul}"
}
En el caso de ODROID, podría ser interesante usar una función cputemp, puedes ejecutar cputemp y obtener la temperatura de la CPU con la siguiente función:
function cputemp()
{
#for XU4 usage, others may differ
cat /sys/devices/virtual/thermal/thermal_zone0/temp
}
Esto te da la temperatura en °C con tres ceros al final. Para un resultado más bonito, sería más adecuado usar un script y así no sobrecargar ~/.bashrc. Puedes añadir todas tus funciones al final del archivo ~/.bashrc, una después de otra.

Alias de BASH

Puede que hayas observado con anterioridad que puedes usar "ll" para "ls -l" en Ubuntu. Para usar alias similares que permitan adaptar los comandos a tus necesidades, crea un nuevo archivo ~/.bash_aliases e introduce líneas con los comandos y las opciones que quieras usar:

$ alias ping='ping -c 5'
por ejemplo, detener el comando ping somehost.com después de hacer 5 pings, similar a la operación de ping en Windows. Otro ejemplo sería obtener un formulario legible cuando quieres ver la cantidad de espacio libre que hay en los discos:
$ alias df='df -h'
En el siguiente artículo, veremos una introducción a los scripts: variables, pruebas, bucles. La línea para crear archivos en diferentes carpetas del último capítulo simplemente es un aperitivo de lo que vendrá en el futuro. Con requisitos más complejos, nuestros ejecutables BASH ya no caben en una única línea; es el momento de escribir auténticos scripts.

Referencias

https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html

Be the first to comment

Leave a Reply