Bash es el intérprete del lenguaje de comandos o shell para el sistema operativo GNU . El nombre es un acrónimo de ‘Bourne Again Shell’, un juego de palabras con Stephen Bourne, el autor del antepasado directo del actual shell de Unix sh, que apareció en la séptima edición de Bell Labs Research de Unix.
[scriptless]
Cuando un ordenador arranca, un kernel (ya sea Linux, BSD, Mach o NT) reconoce todo el hardware físico y permite que cada componente se comunique entre sí y sea orquestado por algún software básico.
El conjunto más básico de instrucciones de un ordenador se limita a mantenerlo encendido y en un estado seguro: activando los ventiladores periódicamente para evitar el sobrecalentamiento, utilizando subsistemas para controlar el espacio en disco o «escuchar» los dispositivos recién conectados, etc. Si esto fuera todo lo que hacen los ordenadores, serían tan interesantes como un horno de convección.
Los informáticos se dieron cuenta de esto muy pronto, así que desarrollaron un shell para los ordenadores Unix que opera fuera del núcleo (o alrededor del núcleo, como un shell en la naturaleza) y permite a los humanos interactuar con el ordenador siempre que quieran.
Fue un desarrollo emocionante en una época en la que la gente introducía tarjetas perforadas en los ordenadores para decirles lo que tenían que hacer. De todos los shells disponibles, Bash es uno de los más populares, el más potente y el más amigable.
[lwptoc min=»1″ backgroundColor=»»]
Bash es una aplicación
Cuando inicias una terminal (como la Terminal de GNOME o Konsole en Linux o iTerm2 en macOS) ejecutando el shell Bash, te encuentras con un prompt.
Un prompt es un símbolo, normalmente un signo de dólar ($), que indica que el shell está esperando tu entrada.
Esto probablemente parezca poco amigable, pero en realidad es una representación perfectamente sucinta de las muchas connotaciones que rodean al término «Bash».
Para muchos usuarios nuevos, no hay separación entre el concepto de Bash y el concepto de Linux o Unix: es la proverbial pantalla negra con texto verde en la que se supone que debes codificar lo que tu ordenador hace a continuación.
Eso confunde el shell Bash con los comandos que escribes en el shell. Es importante entender que son dos cosas distintas: Bash es sólo una aplicación, y su trabajo principal es ejecutar otras aplicaciones (en forma de comandos) que están instaladas en el mismo sistema.
Puedes aprender Bash, pero sólo en el contexto de aprender el sistema operativo en el que se ejecuta. Sin conocer los comandos, no hay mucho que puedas hacer con Bash.
Comandos de Linux
En Linux y Unix (como BSD y macOS), la mayoría de los comandos se almacenan por defecto en directorios del sistema como /usr/bin y /bin.
Por naturaleza, Bash no conoce estos comandos más de lo que tú naturalmente conoces el klingonés, pero así como puedes buscar palabras en klingon, Bash puede buscar comandos.
Cuando emites un comando a Bash, éste busca en directorios específicos de tu sistema para ver si ese comando existe. Si el comando existe, entonces Bash lo ejecuta.
Bash también es un comando, y suele ser el comando que se ejecuta por defecto cuando se abre una ventana de terminal o se entra en una consola de texto.
Para averiguar dónde se encuentra cualquier comando en tu sistema, incluido Bash, puedes utilizar el comando which en un terminal:
$ which bash /usr/bin/bash $ which ls /usr/bin/ls
Algunos comandos están incorporados en Bash. La mayoría de los comandos incorporados son específicos de las secuencias de comandos de Bash o de las configuraciones de entorno de bajo nivel, pero unos pocos son de utilidad universal, como cd (para cambiar de directorio).
Los comandos incorporados no aparecen cuando los buscas porque no existen en tu ruta ejecutable habitual:
$ which bash which: no cd in (/usr/local/bin:/usr/bin:/bin: [...]
Sin embargo, siguen estando disponibles porque están integrados en Bash, y Bash es lo que estás ejecutando.
Ejecutando Bash
La mayoría de las distribuciones modernas de Linux y Unix proporcionan un shell Bash por defecto. Lo hacen porque Bash es bien conocido, y tiene varias funciones convenientes que otros shells no tienen. Sin embargo, algunos sistemas utilizan otro shell por defecto.
Para saber si estás ejecutando un shell Bash, puedes utilizar el comando echo junto con una variable especial que representa el nombre del proceso que se está ejecutando actualmente:
$ echo $0 bash
Si no estás ejecutando Bash, pero te gustaría probarlo, probablemente puedas descargar e instalar Bash desde tu centro de software, repositorio de software o árbol de puertos. O puedes usar Chocolatey en Windows o Homebrew en macOS. Si todo lo demás falla, visita la página web de Bash para obtener más información.
Trabajar en Bash
Bash es una interfaz legítima para tu ordenador, y no es sólo para administradores de servidores y programadores. Puede ser tu escritorio, tu procesador de textos, tu aplicación de edición de gráficos y mucho, mucho más. Algunas personas utilizan Bash más que las aplicaciones de escritorio.
Hay cientos de comandos disponibles para Linux y Unix, y podría sorprenderte lo diversos que son. Por ejemplo, puedes redimensionar y recortar fotos sin necesidad de abrirlas en un visor o editor:
$ mogrify -geometry 1600^x800 \ -gravity Center \ -crop 1600x800+0+0 myphoto.jpg
Puedes reproducir música con comandos como ogg123 o mpg321, convertir audio con sox, ajustar y editar vídeo con ffmpeg, editar texto con emacs o vim, comprobar el correo electrónico con pine o mutt, navegar por Internet con elinks, explorar archivos con ranger o midnightcommander, y hacer mucho, mucho más.
Todo se hace en Bash, utilizando los comandos que encuentres en tu sistema o en tu repositorio de software.
Bash scripting
Una de las razones por las que Bash (y Linux en general) se considera tan poderoso es porque se pueden crear scripts. Cualquier cosa que puedas escribir en Bash manualmente, también puedes listarlo en un archivo de texto plano y hacer que Bash lo ejecute por ti.
En lugar de pasar una tarde ejecutando manualmente un centenar de comandos, puedes programar los comandos y hacer que tu ordenador los ejecute mientras te ocupas de asuntos más importantes. Debido a que casi todo en Linux se ejecuta sobre el shell Bash, casi todo en Linux puede ser programado a través de Bash.
Aunque hay excepciones a esto (las aplicaciones gráficas pueden tener su propio lenguaje de scripting, por ejemplo, o no tener scripting en absoluto), el scripting de tu sistema operativo abre decenas de miles de posibles funciones que puedes hacer que ocurran en tu ordenador sin hacerlas tú mismo.
La cantidad de trabajo que esto ahorra a los usuarios de Linux cada día es imposible de calcular. Sin embargo, no es la automatización habitual la que marca la diferencia; son los flujos de trabajo a medida que la gente inventa para sí misma, las cosas que nadie cree que necesiten automatización.
Cuando los usuarios experimentados dicen que quieren aprender Bash, si no se refieren a que quieren aprender los comandos de Linux, probablemente se refieren a que quieren mejorar la forma en que escriben sus comandos.
Por ejemplo, este es un script Bash extremadamente rudimentario que convierte un archivo temporal (imagina que es un archivo creado por un proceso separado) a un directorio específico:
#!/usr/bin/bash cp tmp.png ~/public_html/`date +%Y%m%d`.png
Es un Bash válido. Puedes comprobarlo copiando y pegando el comando (la última línea que empieza por cp) en un terminal. Mientras haya un archivo llamado tmp.png y un directorio llamado ~/public_html, el comando funciona.
Aprender Bash, sin embargo, es todo acerca de la comprensión de cómo un simple comando como este puede ser mejorado en aras de la automatización. Por ejemplo, si el archivo tmp.png no existe, entonces el script falla.
Si este script es un componente clave para, por ejemplo, un sitio de blogs que requiere una nueva imagen cada día para que se pueda construir una imagen de cabecera personalizada, entonces el fallo del script podría causar errores catastróficos en otros lugares.
Un usuario que conozca Bash podría añadir resiliencia utilizando la sintaxis de Bash:
#!/usr/bin/bash IMG="tmp.png" [[ -e tmp.png ]] || IMG="generic.png" cp ~/"${IMG}" ~/public_html/`date +%Y%m%d`.png
Este es sólo un ejemplo del proceso de aprender a hacer scripts con Bash, pero demuestra cómo aprender tanto Linux como Bash son igualmente útiles y no son tareas totalmente separadas.
Ventajas de Bash
Bash es tan potente como otros shells pero añade funciones de conveniencia como los dobles corchetes ([[ y ]]) en el código de ejemplo.
Estos «Bashismos» son muy queridos por los usuarios de Bash porque evitan la sintaxis a veces verbosa y torpe de otros shells como tcsh o ash. Sin embargo, son exclusivos de Bash y no son compatibles con POSIX, lo que podría causar problemas de compatibilidad en sistemas que no ejecuten Bash.
Por otra parte, Bash es software libre de código abierto, por lo que la mayoría de los usuarios pueden instalarlo si lo necesitan. La falta de compatibilidad sólo obliga a una dependencia extra y no excluye a nadie de usar un script.
[scriptless]