¿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
lsPero ambos . test.shy ./test.shdevolvieron la misma información.

test.shno es lo mismo que./test.sh(el primero invoca unaPATHbúsqueda), también lo es. test.shy es. ./test.shdiferente de la misma manera (el primero invoca unaPATHbúsqueda). Muchas conchas parecen incluir implícitamente.al final dePATHcuando se hace una.búsqueda de ruta, pero este comportamiento no es estándar. Por lo tanto, es más exacto para comparartest.shvs. test.shy./test.shvs. ./test.sh.Respuestas:
./test.shse ejecutatest.shcomo un programa separado. Puede ser un script bash, si el archivotest.shcomienza con#!/bin/bash. Pero podría ser algo completamente distinto.. ./test.shejecuta el código del archivotest.shdentro de la instancia en ejecución de bash. Funciona como si el archivo de contenido setest.shhubiera incluido textualmente en lugar de la. ./test.shlínea. (Casi: hay algunos detalles que difieren, como el valor$BASH_LINENOy el comportamiento de lareturnconstrucción).source ./test.shes idéntico a. ./test.shin bash (en otros shells,sourcepuede 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.she incluir un script con el.incorporado es que si eltest.shscript 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=barentest.sh, yecho $fooal 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.shllamada 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.shobtendrá unalssalida normal (y un PID diferente que el shell actual)Con
. test.sho. ./test.shobtendrá una salida más detallada (y el mismo PID que el shell actual):fuente
.bashrcif [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fiLuego, ingrese sus alias.bash_aliases.aliaspalabra 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