Cuando uso bash shell, a veces guardo variables de entorno en un archivo de texto cuyo contenido copio/pego, por ejemplo, exports.txt:
export FOO=bar
export FIZZ=buzz
Alguien me mostró en lugar de copiar/pegar, podía escribir en la terminal
. exports.txt
lo que tendría el mismo efecto que copiar y pegar.
¿Cuál es el mecanismo por el cual funciona este comando de 'nombre de archivo de espacio de puntos'? Es difícil pensar en términos de búsqueda para ello.
Quiero entender lo que está sucediendo y los detalles más generales de lo que está haciendo esta frase ingeniosa.
Respuesta1
El .
comando ("punto") es un sinónimo/atajo del comando integrado del shell source
.
Hace que el script de shell nombrado se lea y ejecute dentro del contexto de shell actual (en lugar de un subshell). Esto permite que el script fuente modifique el entorno del shell que llama, como configurar variables y definir funciones y alias del shell.
Respuesta2
Si bien las dos respuestas existentes ya son excelentes, creo que falta el ejemplo en el que el efecto es más "notable", por así decirlo.
Digamos que tengo un archivo script.sh
con el siguiente contenido:
cd dir
Si ejecutara este script normalmente ( sh script.sh
), vería esto:
olle@OMK2-SERVER:~$ sh script.sh
olle@OMK2-SERVER:~$
Pero si supiera dónde obtener el script ( . script.sh
), terminaría con esto:
olle@OMK2-SERVER:~$ . script.sh
olle@OMK2-SERVER:~/dir$
¡Observe cómo en el segundo caso el directorio de trabajo de nuestro shell principal ha cambiado!
Esto se debe a que (como se señaló en las otras respuestas) el primer ejemplo se ejecuta en su propio subshell (el sh
proceso que comenzamos con el sh
comando -, esto podría haber sido básicamente cualquier shell, bash
lo dash
que sea), cambia de directorio allí, no hace nada y cierra. Mientras que el segundo ejemplo se ejecuta en nuestro shell principal y, por lo tanto, cambia de directorio allí.
Respuesta3
Aquí hay un ejemplo.
Archivo de script: mytest.sh
cat mytest.sh
#!/bin/bash
myvar=1
mystring="Hello World"
si intenta imprimir cualquiera de las variables anteriores no obtendrá nada
echo $myvar
pero si lo haces
. mytest.sh
o
source mytest.sh
y luego
echo $myvar
imprimirá 1
Solo una respuesta visual de lo que escribió Spiff.