¿Cuál es el significado de un punto antes de un comando en shell?


76

Mientras sigo el tutorial de depuración de Android Eclipse, me encuentro con los siguientes comandos.

cd /path/to/android/root 
. build/envsetup.sh 
lunch 1    
make       
emulator

Mi problema es lo que build/envsetup.shsignifica el punto anterior ?

Respuestas:


80

Un punto en ese contexto significa "fuente" el contenido de ese archivo en el shell actual. Siendo en sourcesí mismo un comando integrado de shell. Y sourcey el operador punto es sinónimo.

Ejemplo

Digamos que tenía los siguientes contenidos en un sample.sharchivo.

$ 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.

Ejemplos

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 envvariables nuevamente:

$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string

72

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 fooscript así

. ./foo

O equivalente:

source ./foo

Si hacemos un pwddespué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


66
Su respuesta es mejor que la aceptada, entendí cómo lo explicó, ¡gracias!
Ahmed

Dun-da-da-duuuun! (redoble de tambores, por favor) ... ¡y la frase más importante aquí de todas es !: La razón es: el aprovisionamiento de un script no requiere 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.
Gabriel Staples

Debes liderar con el segundo ejemplo. Contiene más golpe.
MonoThreaded

5

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.


1

¿Cómo averiguarlo?

# 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.

Creo que falta una coma en el manual. Debería decir "Ejecutar comandos desde un archivo, en el shell actual".
ctrl-alt-delor

1

. (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.

Fuente


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.