Publi

Cómo saber si existe una función en Bash, saber qué estamos ejecutando y más

photo-1457317680121-ef12e98979e8

En nuestra historia como programadores, hacemos infinidad de llamadas a funciones propias, de terceros, de biblioteca, a otros programas a un alias, etc Y si queremos que nuestros scripts sean lo más robustos posible, debemos tener claro antes de la ejecución que aquello que llamamos se puede ejecutar o dar opciones si algún comando o función no existe.

Por ejemplo, nuestro script necesita hacer una llamada a wget de este tipo:

wget -O salida http://totaki.com

Pero queremos hacer que sea compatible con otros sistemas, por ejemplo, con cURL, y no podemos cambiar uno por otro, pues con curl sería con o minúscula:

curl -o salida http://totaki.com

Nuestro script podrá ser:

1
2
3
4
5
6
7
8
if [ -n "$(which wget)" ]; then
    wget -O salida http://totaki.com
elif [ -n "$(which curl)" ]; then
    curl -o salida http://totaki.com
else
    echo "No puedo descargar el fichero"
    exit 1
fi

De modo que probamos la existencia de diferentes programas y utilizamos el que tengamos a disposición. Otra forma sería crear una función bash que se llame wget, pero que utilice cURL para trabajar:

1
2
3
4
5
6
7
8
if [ -z "$(which wget)" ]; then
   function wget()
   {
      curl -o "$2" "$3"
   }
fi

wget -O salida http://totaki.com/

Aunque sólo funcionará cuando las llamadas a wget sean siempre de la misma forma. Ahora bien, hemos utilizado which para conocer dónde se ubica el archivo ejecutable de dicho comando, pero, ¿ y si el comando que estamos utilizando es un alias, o una función de bash ? en ese caso which serviría de poco, ya que éste suele ser un programa externo (en casi todos los Unix), y siendo un programa externo no podría acceder fácilmente a objetos almacenados en Bash.

Para ello, Bash proporciona una orden interna llamada type, que es capaz de decirnos de qué se trata el comando que le pasamos como argumento. Por ejemplo:

$ type wget
wget is /usr/bin/wget
$ type sudo
sudo is /usr/bin/sudo
$ type for
for es una palabra clave del shell
$ function funci() { echo «Hello World!»; }
$ type funci
funci: es una función
funci ()
{
echo «Hello World!»
}
$ type time
time es una palabra clave del shell
$ type echo
echo es una orden interna del shell
$ type ls
ls es un alias de `ls –color=auto’
$ type type
type es una orden interna del shell
$ type algoquenoexiste
bash: type: algoquenoexiste: no se encontró

Estos son algunos ejemplos. Como curiosidad, tenemos time, que es palabra clave de shell, interno de Bash, aunque también existe un comando time que debe ser llamado explícitamente /usr/bin/time; si sólo llamamos a time, Bash prefiere llamar primero a la versión interna, le pilla más cerca.
Vemos también que palabras como for, if, while, case, do, etc también son detectadas por type. Es más, type, se autodefine como orden interna.
Por otro lado, en distribuciones como Ubuntu y derivadas, encontramos que ls es un alias de ls –color=auto para que todo se vea un poco más bonito

¿cómo utilizar esto en nuestros scripts

Pero, ¿cómo utilizamos esto en nuestros scripts? La salida de type es algo compleja para tener que analizarla con métodos textuales, y como vemos, está en español, por lo que estará traducida a decenas de idiomas y eso no es bueno a la hora de llevarnos los scripts a otros lugares. Afortunadamente, type tiene un modificador, -t, que nos devuelve palabras sencillas en inglés (sea cual sea el idioma que utilicemos) que sí podremos utilizar en nuestros scripts:

$ type -t wget
file
$ type -t sudo
file
$ type -t for
keyword
$ type -t funci
function
$ type -t time
keyword
$ type -t echo
builtin
$ type -t ls
alias
$ type -t type
builtin
$ type -t algoquenoexiste

Vemos que en el último caso no recibimos respuesta, es decir, está vacía.

Y con este modificador podremos hacer algo como:

1
2
3
if [ -n "$(type wget)" ]; then
  echo "Existe wget, ya sea aplicación, alias, función..."
fi

Porque si no tenemos wget instalado, tenemos la función anterior creada y utilizamos which, éste seguirá dando un negativo.

Aunque también podemos, como dice el título, verificar la existencia de funciones, algo así como un typeof de Javascript:

1
2
3
if [ "$(type mifuncion)" = "function" ]; then
   echo "La función existe";
fi

o

1
2
3
if [ -z "$(type mifuncion)" ]; then
   echo "La función NO existe";
fi

Y esto podríamos utilizarlo cuando incluimos scripts, a modo de plugin de nuestro script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for plugin in plugins/*.sh; do
  \. $plugin
  plugin_name=${plugin%.*}

  if [ -z "$(type $plugin_name"_version")" ]; then
    echo "Plugin $plugin_name no válido"
    exit 1
  fi

  if [ "$(type $plugin_name"_init")" = "function" ]; then
    echo "Inicializando plugin $plugin_name"
    $plugin_name"_init"
  fi
done

Con este pequeño script incorporaríamos todos los archivos .sh que estén dentro del directorio plugins, tras ello, buscaríamos las funciones cuyos nombres son: «nombre_del_archivo_version» y «nombre_del_archivo_init». Los nombres del archivo van sin extensión. La primera función, si no la encontramos, concluiremos el programa diciendo que el plugin no es válido; la segunda hará una ejecución a dicha función si existe, porque el plugin tal vez no tenga que ser inicializado.

Foto: Matthew Kane

También podría interesarte....

There are 15 comments left Ir a comentario

  1. Pingback: Cómo saber si existe una función en Bash, saber qué estamos ejecutando y más | PlanetaLibre /

  2. OKBet /
    Usando Google Chrome Google Chrome 116.0.0.0 en Windows Windows NT

    Quality posts is the crucial to invite the visitors to visit the web page, that’s what this web page is providing.
    OKBet review

  3. housegloryaldaawli /
    Usando Google Chrome Google Chrome 117.0.0.0 en Windows Windows NT

    تتضمن خدمات مكافحة الحشرات والقوارض:
    1- الكشف عن المشكلة وتحديد نوعية الحشرات أو القوارض ومدى انتشارها.
    2- اتخاذ إجراءات الوقاية والتصدي لانتشار الحشرات والقوارض مثل ترتيب الأغراض والتخلص من الأوساخ والفضلات.
    3- استخدام المبيدات الآمنة والفعالة لإزالة الحشرات والقوارض.
    4- التأكد من السلامة الصحية للبيئة وعدم تأثير المبيدات على الصحة العامة.
    5- توفير النصائح والإرشادات اللازمة لتجنب عودة الحشرات والقوارض مرة أخرى.
    من الحشرات التي يتم مكافحتها: الصراصير، النمل، البعوض، الذباب، البراغيث، القراد، الدبابير، وغيرها.
    ومن القوارض التي يتم مكافحتها: الجرذان، الفئران، الأرانب، وغيرها.
    مكافحة حشرات وقوارض

  4. rakhi sharma /
    Usando Google Chrome Google Chrome 118.0.0.0 en Windows Windows NT

    We value your health, well being and life, therefore is important for us to take care of ourselves. Our array of Gurgaon Call Girls Service is immensely professional and bound with their commitment of safety and satisfaction of our client. All our sassy call girls are highly talented in sensual skills of contending the sexual needs of clients.

  5. betterwound /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    All of our sassy call ladies are extremely skilled in sensuous skills of contending with clients’ sexual wants. doodle jump

  6. jsimitseo /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    I feel like a kid in a candy store, but with the biggest web slots. Where do I start. สล็อตเว็บใหญ่ สุด

  7. WilliamSEO /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    So parcel to happen over your astounding site. Your blog acquires me a phenomenal exchange of charming.. Salubrious part alongside the scene. pasar123 gacor

  8. jsimitseo /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    Durability testing should be a standard in slot production. สล็อตเว็บตรง แตกง่าย

  9. jsimitseo /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    it’s extremely pleasant and meanful. it’s extremely cool blog. Connecting is exceptionally valuable thing.you have truly helped bunches of individuals who visit blog and give them usefull data. สล็อตรวมทุกค่าย

  10. jsimitseo /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    Can pleasantly compose on comparative themes! Welcome to here you’ll discover how it should look. เว็บสล็อตโรม่า

  11. jsimitseo /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    I’m eager to reveal this page. I have to thank you for ones time for this especially awesome read!! I unquestionably extremely enjoyed all aspects of it and I likewise have you spared to fav to take a gander at new data in your site. เกมส์ไพ่ป๊อกเด้ง

  12. jsimitseo /
    Usando Google Chrome Google Chrome 121.0.0.0 en Windows Windows NT

    In the wake of looking at your article I was stunned. I comprehend that you clear up it phenomenally well. Likewise, I expect that differing perusers will in like way encounter how I feel in the wake of examining your article. best concierge doctor

  13. pluxo /
    Usando Google Chrome Google Chrome 121.0.0.0 en Windows Windows NT

    Excellently published document, but only if many blog writers made available i You need to thanks!assessoria de marketing

  14. WilliamSEO /
    Usando Google Chrome Google Chrome 121.0.0.0 en Windows Windows NT

    The best article I ran over various years, compose something about it on this page. สล็อตเว็บตรง แตกง่าย

  15. Usando Google Chrome Google Chrome 122.0.0.0 en Windows Windows NT

    I really like the way that you have expressed yourself. There is a lot to be admired from this post. You might want to click on

Leave a Reply