¿Qué hace el comando 'nombre de archivo de espacio de puntos' en bash?

¿Qué hace el comando 'nombre de archivo de espacio de puntos' en bash?

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.shcon 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 shproceso que comenzamos con el shcomando -, esto podría haber sido básicamente cualquier shell, bashlo dashque 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.

información relacionada