Una de las grandes ventajas de Bash es que es un estándar y lo puedes encontrar en prácticamente cualquier servidor Linux. Esto facilita a que un script implementando en Bash, lo puedes ejecutar en casi cualquier servidor. Pero, necesitas conocer Bash, que si bien no es complejo, y para esto tienes el tutorial de scripts en Bash, no tiene la riqueza y simplicidad de Python. Sin embargo, siempre tienes la posibilidad de combinar Bash con Python, utilizando una herramienta como es zxpy
.
Desata el poder de Bash con Python
Sobre zxpy
En pocas palabras, zxpy
es una herramienta que permite integrar de manera fluida comandos de la terminal (shell commands) dentro del código de Python. Esto facilita la creación de scripts de shell que son legibles y fáciles de mantener. Está inspirado en «zx» de Google, pero zxpy
busca simplificar y hacer más accesible esta funcionalidad utilizando Python como base. En lugar de tener scripts separados en diferentes lenguajes, zxpy
te permite combinar comandos de shell directamente en tu código Python, simplificando así el proceso de escritura y mantenimiento de scripts.
zxpy
tiene como objetivo mejorar la utilidad de Bash al permitirte escribir scripts en Python, pero con un soporte nativo para comandos y pipes de Bash. Bash es poderoso y se vuelve aún más potente cuando se combina con los coreutils de Linux y pipes. Sin embargo, aprender Bash puede ser todo un desafío, ya que es un lenguaje diferente con una sintaxis comparativamente menos intuitiva, especialmente para cosas como condicionales y bucles.
Así, zxpy
busca sobrecargar Bash al ofrecer la posibilidad de escribir scripts en Python, mientras aprovechas las capacidades de Bash para los comandos y pipes
. De esta manera, se combina la simplicidad y familiaridad de Python con la potencia y flexibilidad de Bash, haciendo que la escritura de scripts sea más accesible y comprensible.
Un sencillo ejemplo
Para localizar todos los comentarios en un repositorio git
, lo puedes hacer de la siguiente forma,
#!/usr/bin/env zxpy
todo_comments = ~"git grep -n TODO *.md"
for todo in todo_comments.splitlines():
filename, lineno, code = todo.split(':', 2)
*_, comment = code.partition('TODO')
print(f"{filename:40} on line {lineno:4}: {comment.lstrip(': ')}")
De esta forma si ejecuto zxpy ejemplo.py
en un repositorio obtengo lo siguiente,
recursos/herramientas-de-terminal.md on line 316 : manager with git-based sync + markdown notes per task
recursos/herramientas-de-terminal.md on line 341 : list manager
Instalación
Para instalar zxpy
en tu equipo, en el caso de que esté utilizando ArchLinux, lo puedes hacer desde los repositorios AUR, utilizando el siguiente comando,
paru -S zxpy
En el caso de que estés utilizando cualquier otra distribución, siempre lo puedes hacer utilizando pip
de la siguiente forma,
python -m pip install --user zxpy
La salida estándar
Si quieres obtener la salida estándar y la salida de error, en lugar de ejecutarlo como lo has visto en el ejemplo anterior, tienes que utilizar la siguiente sintaxis,
stdout, stderr, return_code = ~"git grep -n TODO"
De esta forma, el ejemplo anterior se puede convertir en lo siguiente,
#!/usr/bin/env zxpy
stdout, stderr, return_code = ~"git grep -n TODO recursos/*.md"
if return_code == 0:
for todo in stdout.splitlines():
filename, lineno, code = todo.split(':', 2)
*_, comment = code.partition('TODO')
print(f"{filename:40} on line {lineno:4}: {comment.lstrip(': ')}")
else:
print(return_code)
print(stderr)
Si esto lo ejecutas en un directorio que no sea un repositorio git
el resultado será el que te muestro a continuación,
128
fatal: no es un repositorio git (ni ninguno de los directorios superiores): .git
Argumentos
Si bien en la documentación indica que es posible pasar argumentos al script, lo cierto es que después de diferentes pruebas, yo he sido incapaz de hacerlo. Si alguien lo ha conseguido, le agradeceré enormemente que me indique como hacerlo.
Comillas
Algo que tienes que tener en cuenta, como no podía ser de otra forma, es el uso de las comillas. Es decir, que cuando ejecutes un comando tienes que tener en cuenta las comillas. Por ejemplo, el siguiente código da un error,
cmd = "uname -a"
~f"{cmd}"```
Para evitar este problema tienes que utilizar lo siguiente,
bash
cmd = «uname -a»
~f»{cmd:raw}»«`
Modo interactivo
También tienes la posibilidad de utilizar zxpy
en modo interactivo, ya sea ejecutando directamente zxpy
o bien, utilizando python -m zx
. Una forma muy interesante de realizar tus pruebas y luego materializarlas en un script.
El vídeo
A continuación lo mismo que te he contado, pero en formato vídeo
Más información,