Incrustar otros lenguajes en scripts de Bash

Como todos saben Bash es una excelente forma de automatizar procesos en GNU/Linux, pero aunque es muy poderoso tiene algunas limitaciones que en muchas ocasiones nos obligan a reescribir el programa en otro lenguaje; pero ¿y si pudiéramos incrustar ese código que esta en otro lenguaje dentro de nuestro script Bash?

bash_logoSupongamos que necesitamos guardar en una variable el resultado de un cálculo para saber el valor de Pi pero solo sabemos realizar este cálculo en Lua, para ello necesitamos tener el interprete de Lua, para este ejemplo el código de Lua será el siguiente.

lua5.2 -e "print(string.format("%f", math.pi))"

Para guardar ese valor en una variable de Bash el código quedaría de la siguiente manera.

#!/bin/bash
pi=$(lua5.2 -e "print(string.format("%f", math.pi))")
echo $pi

Como pueden ver dentro de la variable llamamos al interprete de Lua para que ejecute el cálculo y nos devuelva el valor de Pi para luego mostrarlo en pantalla mediante un “echo”, mediante este método podemos incrustar los siguientes interpretes.

python -c ""
python3 -c ""
jython -c ""
cython -c ""
ruby -e ""
jruby -e ""
rubyjs -e ""
perl -e ""
csh -c ""
tcsh -c ""
mksh -c ""
ksh -c ""
zsh -c ""
ash -c ""
dash -c ""
fish -c ""
coffee -e ""
lua5.2 -e ""
scilab -e ""

A la hora de incrustar otros lenguajes en Bash el programador debe utilizar caracteres de escape para evitar que algunas cosas sean interpretadas erróneamente por Bash, un ejemplo de esto se puede ver en el siguiente código.

#!/bin/bash
casa=$(perl -e "print "Hola mundo."")
echo $casa

Como se puede observar Bash mal interpretaría las ” causando que al ejecutar el script este no nos devuelva ningún valor, para evitar esto se puede utilizar el carácter \ como se verá en el siguiente ejemplo.

#!/bin/bash
casa=$(perl -e "print \"Hola mundo.\"")
echo $casa

Adicionalmente el código incrustado puede enviar y recibir información de diversas formas, ya sea por medio de tuberías, variables, escritura en archivos, etc. Un ejemplo sencillo del uso de tuberías seria el siguiente.

ksh -c "df" | cat > ./archivo

Y este es un pequeño ejemplo usando variables.

export test="/dev"; ash -c "test="/etc"; ls $test"

En el siguiente ejemplo podemos ver como se incrusta código de otros lenguajes (en este caso python) mediante una función.

#!/bin/bash
export mio="Hola Mundo"

function prueba {
python - <<END
import os
print os.environ['mio']
END
}

prueba

Si se utiliza de manera correcta, incrustar código de otros lenguajes en Bash puede ser beneficioso pero si no se tiene cuidado el desarrollo puede tornarse muy complicado y resultar en un rendimiento bastante pobre.

Mas información:

Anuncios

Un pensamiento en “Incrustar otros lenguajes en scripts de Bash

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s