¿Qué está haciendo el comando 'dot space filename' en bash?

30

Cuando uso bash shell, a veces mantengo las variables de entorno en un archivo de texto del que copio / pego el contenido, por ejemplo, exportaciones.txt:

export FOO=bar
export FIZZ=buzz

Alguien me mostró en lugar de copiar / pegar, podría escribir en la terminal

. exports.txt

que tendría el mismo efecto que copiar / pegar.

¿Cuál es el mecanismo por el cual funciona este comando 'dot space filename'? 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.

iancoleman
fuente
23
Ejecutar help . Esto es tan corto que el motor de Stack Exchange cree que es demasiado corto para ser un comentario.
Comodín
55
Me pregunto por qué ocurren todas estas preguntas también en este sitio. Han sido respondidas muchas veces en Stack Overflow , Ask Ubuntu y Unix & Linux .
fedorqui
Para ejecutar el espacio de puntos, necesitaría escribir '. ' args, con comillas simples o dobles. De lo contrario, bash se come el espacio sin comillas cuando analiza la línea en fichas (consulte "división de palabras" en el manual de bash).
Peter Cordes
1
En bash, un nombre alternativo para .es source, que literalmente significa "comandos de origen de este archivo", al menos para mí.
jpaugh

Respuestas:

40

El .comando ("punto") es un sinónimo / acceso directo para el sourcecomando incorporado del shell .

Hace que el script de shell con nombre se lea y se ejecute dentro del contexto de shell actual (en lugar de un subshell). Esto permite que el script de origen modifique el entorno del shell de llamada, como establecer variables y definir funciones y alias de shell.

Spiff
fuente
49
En realidad, sourcees un sinónimo / atajo no estándar y no portátil para el comando "punto" ( ) definido por POSIX. , y no al revés.
terdon
8
bash proporciona un modo no estándar sourcey no estándar .en modo no POSIX, los cuales buscan en el directorio actual incluso si no forma parte de él $PATH. En modo POSIX, proporciona un estándar .que no busca en el directorio actual, y no source. En ninguno de los modos es sourcesinónimo del .comando POSIX .
hvd
26

Si bien las dos respuestas existentes ya son excelentes, siento que falta el ejemplo en el que el efecto es más "notable".

Digamos que tengo un archivo script.shcon los siguientes contenidos:

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 encontrar el script ( . script.sh), terminaría con esto:

olle@OMK2-SERVER:~$ . script.sh
olle@OMK2-SERVER:~/dir$

¡Observe cómo en el segundo caso ha cambiado el directorio de trabajo de nuestro shell principal!

Esto se debe a que (como en punta a cabo en las otras respuestas) El primer ejemplo se ejecuta en su propio subnivel (el shproceso partimos de la sh-command, esto podría haber sido, básicamente, cualquier cáscara, bash, dash, lo que sea), cambia el directorio existe, no hace nada y cierra. Mientras que el segundo ejemplo se ejecuta en nuestro shell principal, ¡cambia el directorio allí!

Olle Kelderman
fuente
4

Aquí hay un ejemplo.

Archivo de script: mytest.sh

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"

si intenta imprimir alguna de las variables anteriores, no obtendrá nada

echo $myvar

pero si lo haces

. mytest.sh

o

source mytest.sh

y entonces

echo $myvar

imprimirá 1

Solo una respuesta visual de lo que escribió Spiff

el raismo
fuente
Entonces, interpretando su ejemplo, usar exportes solo si esas variables se van a usar en subcapas. Podría omitir exporten el archivo si las variables solo se usan en el shell actual. ¿Está bien?
iancoleman
1
Muy bien y podría decir que sí. Sin embargo, el uso del comando de exportación es más útil o más comprensible si piensa en las variables de entorno del shell. Por ejemplo $ HOME o $ DISPLAY. Sí, podría usar el comando de exportación para exportar una variable en su sesión de shell o en cualquier subshell, pero desaparecerá tan pronto como finalice esa sesión.
Raism