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