¿Cuál es la diferencia entre ejecutar un script como este?
./test.sh
y ejecutando un script como este:
. test.sh
?
Intenté 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
devolvieron la misma información.
test.sh
no es lo mismo que./test.sh
(el primero invoca unaPATH
búsqueda), también lo es. test.sh
y es. ./test.sh
diferente de la misma manera (el primero invoca unaPATH
búsqueda). Muchas conchas parecen incluir implícitamente.
al final dePATH
cuando se hace una.
búsqueda de ruta, pero este comportamiento no es estándar. Por lo tanto, es más exacto para comparartest.sh
vs. test.sh
y./test.sh
vs. ./test.sh
.Respuestas:
./test.sh
se ejecutatest.sh
como un programa separado. Puede ser un script bash, si el archivotest.sh
comienza con#!/bin/bash
. Pero podría ser algo completamente distinto.. ./test.sh
ejecuta el código del archivotest.sh
dentro de la instancia en ejecución de bash. Funciona como si el archivo de contenido setest.sh
hubiera incluido textualmente en lugar de la. ./test.sh
línea. (Casi: hay algunos detalles que difieren, como el valor$BASH_LINENO
y el comportamiento de lareturn
construcción).source ./test.sh
es idéntico a. ./test.sh
in bash (en otros shells,source
puede ser ligeramente diferente o no existir por completo;.
para su inclusión está en el estándar POSIX).La diferencia visible más común entre ejecutar un script separado
./test.sh
e incluir un script con el.
incorporado es que si eltest.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 del script, el entorno del proceso de shell único se establece. Si se agrega una líneafoo=bar
entest.sh
, yecho $foo
al final de la secuencia de comandos de llamada, verá la diferencia:fuente
echo $$
al script mostrará la diferencia bastante clara. La$$
variable contiene el PID del shell actual.. ./test.sh
llamada desde otro script de shell para usar funciones que se describen en test.sh. Quiero decir, no solo se pueden establecer variables, sino que también se pueden crear nuevas funciones de esta manera que luego se pueden llamar desde bash o algún otro script.. /usr/libexec/company/tools; custom_command "variable
"Ejecutar un script de la primera manera lo ejecuta como un proceso secundario. Sourcing (la segunda forma), por otro lado, ejecuta el script como si hubiera ingresado todos sus comandos en el shell actual: si el script establece una variable, permanecerá establecido, si el script sale, su sesión se cerrará. Ver
help .
para documentación.fuente
Otra cosa que noto es que si tienes un alias como este:
Con esto
./test.sh
obtendrá unals
salida normal (y un PID diferente que el shell actual)Con
. test.sh
o. ./test.sh
obtendrá una salida más detallada (y el mismo PID que el shell actual):fuente
.bashrc
if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi
Luego, ingrese sus alias.bash_aliases
.alias
palabra clave? (¿Tal vez eso es solo un error en tu publicación - en la línea 3?)El uso principal para mí
source
(o.
) es bash funciones .Tengo scripts con muchas funciones y las ejecuto todas con mi
.bashrc
. Las funciones "se convierten" en comandos, que uso a menudo.fuente