¿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 alguna diferencia:
#!/bin/bash
ls
Pero ambos . test.sh
y ./test.sh
devolvió la misma información.
Respuesta aceptada:
./test.sh
ejecuta test.sh
como un programa separado. Puede ser 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
se había incluido textualmente en lugar del . ./test.sh
línea. (Casi:hay algunos detalles que difieren, como el valor de $BASH_LINENO
, y el comportamiento del return
integrado.)
source ./test.sh
es idéntico a . ./test.sh
en bash (en otros shells, source
puede ser ligeramente diferente o no existir del todo; .
para su inclusión está en el estándar POSIX).
La diferencia más comúnmente visible entre ejecutar un script separado con ./test.sh
e incluyendo un script con el .
incorporado es que si el test.sh
script establece algunas variables de entorno, con un proceso separado, solo se establece el entorno del proceso secundario, mientras que con la inclusión de script, se establece el entorno del único proceso de shell. Si agrega una línea foo=bar
en test.sh
y 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