Aprenda la diferencia entre abastecimiento y bifurcación en Bash


El objetivo principal de este artículo es comprender claramente lo que sucede cuando ejecuta el script frente a la fuente del script en bash. Primero, entenderemos claramente cómo se envía el programa cuando llame al script de diferentes maneras.

NOTA: no importa crear el script con una extensión. El script funcionará bien incluso sin extensiones.

Básicamente, cada script comienza con una línea llamada shebang (#!). El símbolo Hash en bash se interpretará como comentarios, pero shebang tiene un significado especial. Le dice a bash que envíe el programa en cualquier intérprete que haya mencionado en shebang.

A continuación se muestra un programa de muestra y estoy especificando bash como mi intérprete.

$ cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"

$ chmod +x Hello_world.sh

Ahora, para ejecutar el script, puede hacerlo de dos formas.

  • Utilice una ruta relativa para llamar al script. Vaya al directorio donde está presente el script y ejecute ./Hello_world.sh.
  • Utilice la ruta absoluta para llamar al script. Desde cualquier lugar del sistema de archivos, escriba la ruta completa a la secuencia de comandos.

$ ./Hello_world.sh
$ pwd
$ /home/karthick/Hello_world

Ahora veamos qué sucede cuando intenta enviar su programa sin shebang. En ausencia de shebang, el programa se enviará a cualquier shell actual con el que esté ejecutando, en mi caso, es Bash (/ bin/bash).

Déjame demostrarte un ejemplo. Estoy creando un script de Python sin shebang y cuando llamo al programa, bash no sabe que debe enviar este programa al intérprete de Python en su lugar, ejecutará el programa en el shell actual.

$ cat > run-py.py
echo $SHELL
print("Hello world")

$ chmod +x run-py.py
$ ./run-py.py

En este caso, puede llamar al programa mencionando a qué intérprete se debe enviar o simplemente agregue la línea shebang, que siempre se recomienda.

# which python3
$(which python3) /home/karthick/run_py.py

Ahora que sabe cómo llamar al script, el siguiente paso sería comprender qué sucede cuando llamamos al script. Cuando invoca el script como se muestra en los ejemplos anteriores, se creará un proceso hijo (bifurcación) y el script se enviará al proceso hijo. Ejecuté un script de muestra que solo ejecutará el siguiente comando y muestra que el script se envía a un proceso secundario.

$ ps -ef --forest | grep -i bash

Puede haber varios procesos secundarios como parte del script y eso depende de nuestro código. Cabe señalar que las variables ambientales creadas por subíndice se eliminarán una vez finalizado. Un proceso hijo puede acceder a las variables creadas por el proceso padre exportándolas. Pero el proceso padre no puede acceder a las variables creadas por el proceso hijo.

Eche un vistazo a los artículos a continuación para comprender más sobre cómo funcionan las variables y cómo exportarlas.

  • Comprender y escribir "variables de Linux" en secuencias de comandos de shell
  • Conozca la diferencia entre $$y $BASHPID en Bash

Origen del guión

"Fuente" es un comando integrado de shell que lee el archivo que se le pasa como argumento y ejecuta el código en el entorno de shell actual. Un caso de uso apropiado que usa principalmente es modificar su configuración en .bashrc o .bash_profile y volver a cargar los cambios usando el comando fuente.

$ type -a source

Hay dos formas sintácticas de ejecutar el comando de origen. Puede elegir a cualquiera entre dos sintaxis y es una elección personal.

$ source FILE_NAME [ARGUMENTS]
$ . FILE_NAME [ARGUMENTS]

Déjame demostrarte cómo funciona realmente la fuente. Voy a crear dos scripts de shell. El primer script (Module.sh) contendrá algunas variables y funciones. El segundo script (Main.sh) imprimirá la variable y llamará a la función.

Archivo Module.sh.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo “Function f1 is called”
}

Archivo Main.sh.

#!/usr/bin/env bash

echo $VAR1
f1

Establezca el permiso de ejecución para el script y llame al script principal "main.sh". Ahora, este script intentará encontrar la función f1 y la variable VAR1 en el entorno de shell actual y fallará con el comando no encontrado.

$ bash main.sh

Ahora ejecutemos el comando de origen dentro del script que cargará la variable y las funciones en el entorno de shell actual y al que se podrá acceder mediante "main.sh".

Archivo Module.sh.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo "Function f1 is called"
}

Archivo Main.sh.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Ahora ejecute el script nuevamente y vea.

$ bash main.sh

La fuente es muy útil en bash para seguir el enfoque de programación modular al crear nuestros scripts de shell. Podemos dividir nuestro código en módulos más pequeños y se puede utilizar en muchos programas. De esta manera, podemos seguir el principio DRY (No te repitas).

Eso es todo por este artículo. Hemos discutido brevemente la diferencia entre abastecimiento y bifurcación en bash. Lea el artículo y comparta sus valiosos comentarios con nosotros.