7 votos

Diferencia entre dos comandos de Terminal bastante similares

Tengo un script que ejecuto como parte de mi desarrollo (es la activación de la secuencia de comandos de Python venv medio ambiente). La forma en que la documentación sugiere que debemos ejecutar es ir a la carpeta que contiene nuestro venv carpeta y ejecutan . venv/bin/activate. Esto funciona correctamente (segundo comando en mi ejemplo).

Sin embargo, lo que normalmente debería ejecutar es ./venv/bin/activate, es decir, proporcionar una ruta de acceso relativa al activar la secuencia de comandos (primer comando en mi ejemplo). Esto no funciona en absoluto (aunque no me sorprende, porque al activar el archivo no tiene permisos de "ejecutar" para obtenerla).

My-MBP:flask-tutorial stephendewey$ ./venv/bin/activate
-bash: ./venv/bin/activate: Permission denied
My-MBP:flask-tutorial stephendewey$ . venv/bin/activate
(venv) My-MBP:flask-tutorial stephendewey$

¿Cuál es el comando que funciona (. venv/bin/activate) haciendo en realidad? Nunca he visto sintaxis como antes.

8voto

yoliho Puntos 340

El . el mandato es un alias para la fuente de modo que los dos comandos son realmente

./venv/bin/activate

y

source venv/bin/activate

También tenga en cuenta que para que el sistema de proceso de un archivo que necesita la ruta de acceso absoluta, es decir un principio con /

Tanto los nombres de los archivos aquí son relativos es decir que sólo puede ser entendido con el conocimiento del directorio actual que es la variable $(CWD)

Los dos nombres de archivo expandir $(CWD)/./venv/bin/activate y $(CWD)/venv/bin/activate . es el directorio actual y por lo tanto son de $(CWD)/venv/bin/activate

La diferencia entre ejecutar un comando directamente o a través de la fuente es que si se ejecuta de manera directa como en el primer comando bash crea un nuevo sub shell y ejecuta el comando en el que los comandos de la secuencia de comandos sólo afectan a la sub shell y cuando la secuencia de comandos se rasga que sub shell está cerrado y todos los cambios del medio ambiente se han perdido. fuente, sin embargo, se ejecuta el comando en el shell actual y los cambios en el medio ambiente siguen siendo después de que finalice la secuencia de comandos como si los comandos de la secuencia de comandos se escriben en el shell actual.

El activar la secuencia de comandos (supongo que es de Python entorno virtual de administración) funciona cambiando la $RUTA, por lo que la correcta ambiente python se encuentran cuando se utilizan python script.py Para hacer esto usted necesita para alterar su actual $PATH y así activar el script debe ejecutarse utilizando como fuente.

Ver también https://askubuntu.com/questions/182012/is-there-a-difference-between-and-source-in-bash-after-all y https://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-vs-sourcing-it

No es que la ejecución de un comando requiere el comando para que sea ejecutable. El comando a ejecutar es siempre un archivo y ese archivo tiene que ser marcado como ejecutable por el sistema. Que es el ejecutable de la bandera tiene que ser establecido en los permisos de archivo que se puede ver por ls -l venv/bin/activate

fuente, sin embargo es en el shell actual y simplemente lee el archivo de texto y, a continuación, ejecuta los comandos que se ve, por Lo que este archivo sólo debe ser legible. Para más información sobre que ver https://unix.stackexchange.com/questions/291404/why-does-bashs-source-not-need-the-execution-bit me gusta esta respuesta

Es más de una conveniencia cosa: Dejar que el sistema funcione para mí directamente si el bit está establecido, de lo contrario tengo que hacerlo indirectamente

7voto

Desde man bash :

 . filename [arguments]
source filename [arguments]
    Read and execute commands from filename in the current shell environment and
    return the exit status of the last command executed from filename. If filename
    does not contain a slash, filenames in PATH are used to find the directory
    containing filename. The file searched for in PATH need not be executable.
 

Entonces, básicamente, source ejecuta el código dentro del script / archivo como parte del entorno de shell actual (que es diferente de ejecutarlo, que lo ejecuta en un shell separado). Esto se usa principalmente para establecer variables de entorno, alias, etc., para ser usados en el shell actual.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X