Respuestas:
Un punto en ese contexto significa "fuente" el contenido de ese archivo en el shell actual. Siendo en source
sí mismo un comando integrado de shell. Y source
y el operador punto es sinónimo.
Digamos que tenía los siguientes contenidos en un sample.sh
archivo.
$ cat sample.sh
echo "hi"
echo "bye?"
Ahora cuando lo obtengo:
$ . sample.sh
hi
bye?
$
Los archivos como este se utilizan a menudo para incorporar comandos de configuración, como agregar elementos a las variables de entorno.
Decir que he tenido estos comandos en otro archivo, addvars.sh
.
$ cat addvars.sh
export VAR1="some var1 string"
export VAR2="some var2 string"
Tenga en cuenta que no tengo ninguna variable en el entorno actual de mi shell.
$ env | grep VAR
$
Ahora cuando obtengo este archivo:
$ . addvars.sh
$
OK, no parece que haya hecho nada, pero cuando verificamos las env
variables nuevamente:
$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
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 del PATH
. No necesita ser ejecutable.
# type .
. is a shell builtin
# help .
.: . filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
. (operador de origen o punto)
Lea y ejecute comandos del argumento del nombre de archivo en el contexto actual del shell.
Syntax
. filename [arguments]
source filename [arguments]
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.
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)