Búsqueda de sitios web

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 versus el código fuente del script en bash. Primero, entenderemos claramente cómo se envía el programa cuando llamas al script de diferentes maneras.

NOTA: crear el script con una extensión no importa. 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 comentario, pero shebang tiene un significado especial. Le dice a bash que envíe el programa en cualquier intérprete que hayas mencionado en shebang.

A continuación se muestra un programa de muestra y especifico 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, puedes hacerlo de dos maneras.

  • 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 al script.
./Hello_world.sh
pwd
/home/karthick/Hello_world

Ahora veamos qué sucede cuando intentas enviar tu 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).

Permítanme demostrar 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, sino que 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 agregar la línea shebang que siempre se recomienda.

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

Ahora que sabes cómo llamar al script, el siguiente paso sería entender qué sucede cuando lo llamamos. 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 simplemente 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 el subíndice se eliminarán una vez que finalice. 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 siguientes para comprender más sobre cómo funcionan las variables y cómo exportarlas.

  • Comprensión y escritura de 'variables de Linux' en scripts de Shell
  • Aprenda la diferencia entre $$y $BASHPID en Bash

Obtener el guión

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

type -a source

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

source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]

Permítanme demostrarles 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 Módulo.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 fuente 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 Módulo.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 podemos usarlo en muchos programas. De esta manera, podemos seguir el principio SECO (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.