¿Cuál es la diferencia entre obtener ('.' O 'fuente') y ejecutar un archivo en bash?

Pregunta:

¿Cuál es la diferencia entre ejecutar un script como este?

./test.sh

y ejecutando un script como este:

. test.sh ?

Probé un script simple de dos líneas para ver si podía encontrar si había una diferencia:

#!/bin/bash
ls

Pero ambos . test.sh y ./test.sh devolvieron la misma información.

Respuesta:

./test.sh ejecuta test.sh como un programa separado. Puede suceder que sea un script bash, si el archivo test.sh comienza con #!/bin/bash . Pero podría ser algo completamente diferente.

. ./test.sh ejecuta el código del archivo test.sh dentro de la instancia en ejecución de bash. Funciona como si el archivo de contenido test.sh hubiera incluido textualmente en lugar de . ./test.sh línea. (Casi: hay algunos detalles que difieren, como el valor de $BASH_LINENO y el comportamiento del return incorporado).

source ./test.sh es idéntico a . ./test.sh en bash (en otras cáscaras, source pueden ser ligeramente diferentes o no existir por completo; . para su inclusión en el estándar POSIX).

La diferencia más comúnmente visible entre ejecutar una secuencia de comandos separada con ./test.sh e incluir una secuencia de comandos con la ./test.sh . incorporado es que si el script test.sh establece algunas variables de entorno, con un proceso separado, solo se establece el entorno del proceso hijo, mientras que con la inclusión del script, se establece el entorno del proceso de shell único. Si agrega una línea foo=bar en test.sh y hace echo $foo al final del script de llamada, verá la diferencia:

$ cat test.sh
#!/bin/sh
foo=bar
$ ./test.sh
$ echo $foo

$ . ./test.sh
$ echo $foo
bar

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım