Para agregar a la respuesta de slm:
Hay dos formas de ejecutar un script de shell. Una es ejecutar el script en un proceso separado, lo que significa que cualquier cosa sobre el entorno del shell (estado de memoria) volverá al estado del shell "padre" antes de ejecutar el proceso del shell "hijo".
Por ejemplo, el directorio de trabajo actual (la ubicación en la que se encuentra el sistema de archivos) se determina por proceso. Entonces, tengamos un script que se vea así:
#!/bin/bash
cd ~
cd ..
pwd
Por lo tanto, vamos a llamar a este script, oh, foo
. Y ejecutemos este script de la siguiente manera:./foo
Veremos lo siguiente:
/home
(Descargo de responsabilidad estándar de que hay una gran cantidad de distribuciones de clones de Linux y UNIX, algunas de las cuales no colocan los directorios de los usuarios /home
. O, como solíamos decir "Su kilometraje puede variar")
Ahora, después de ejecutar este script, escriba este comando
pwd
Para ver en qué directorio estamos. Veremos algo como esto:
/home/username
La razón es que, nuevamente, el script de shell que ejecutamos tenía su propio entorno (incluido su propio directorio donde se ejecutaban los comandos), y ese entorno desapareció una vez que el script terminó de ejecutarse.
Ahora, ejecutemos el foo
script así
. ./foo
O equivalente:
source ./foo
Si hacemos un pwd
después, veremos esto:
/home
La razón es: el aprovisionamiento de un script no llama a un proceso separado. Es como escribir todos los comandos en el proceso padre a mano; su entorno se conserva una vez que finaliza el script.
Permítanme proponer un ejemplo más simple. Tengamos un script que se vea así:
#!/bin/bash
exit
Vamos a nombrarlo foo
. Vamos a asegurarnos de que podemos ejecutarlo: chmod 755 foo
. Entonces, hagámoslo así:
./foo
No pasa nada. Sin embargo, por otro lado, si hacemos esto:
. ./foo
O esto:
source ./foo
Nos desconectamos
El punto (punto) es una abreviatura para el bash incorporado
source
. Leerá y ejecutará comandos de un archivo en el entorno actual y devolverá el estado de salida del último comando ejecutado. Los archivos pueden estar en el directorio actual o en cualquier lugar delPATH
. No necesita ser ejecutable.fuente
¿Cómo averiguarlo?
fuente
. (operador de origen o punto)
Lea y ejecute comandos del argumento del nombre de archivo en el contexto actual del shell.
source es sinónimo de punto / punto '.' en bash, pero no en POSIX sh, por lo que para obtener la máxima compatibilidad, utilice el punto.
Cuando un script se ejecuta utilizando la fuente, se ejecuta dentro del shell existente, cualquier variable creada o modificada por el script permanecerá disponible una vez que se complete el script. Por el contrario, si el script se ejecuta como un nombre de archivo, se generaría una subshell separada (con un conjunto de variables completamente separado) para ejecutar el script.
Hay una sutil diferencia entre ejecutar un script ejecutando .ss64script (dot ss64script) y. ss64script (espacio de puntos ss64script)
el primero es ejecutar un archivo que se ha ocultado del comando 'ls' (aunque ls -a mostrará archivos ocultos) la segunda opción ejecutará ss64script incluso si no se ha configurado como ejecutable con chmod.
Fuente
fuente
TL; DR
El punto es el mismo que el comando de origen.
source es un comando de Unix que evalúa el archivo que sigue al comando, como una lista de comandos, ejecutados en el contexto actual.
Extraído de https://en.wikipedia.org/wiki/Source_(command)
fuente