ejecutando script con ". "Y con" fuente "

26
  1. Me preguntaba si las siguientes dos formas de ejecutar un script bash son equivalentes.

    . ./myScript.sh
    
    source myScript.sh
    
  2. ¿Ambos ejecutan el contenido del script en lugar de ejecutar el script, es decir, no crean una subshell para ejecutar el script?
Tim
fuente
1
¡Hola, eso está en la página de manual!
alex
@alex: muéstrame por favor? man ., man sourceo lo que sea que aún no sepa.
Tim
2
See type .andhelp .
rozcietrzewiacz
man $SHELL,/source
alex
44
. Es más portátil según otros.
l0b0

Respuestas:

21
  1. Son equivalentes en bash porque hacen exactamente lo mismo. Por otro lado, sourcetiene 5 caracteres más y no es portátil para shells solo POSIX o Bourne, mientras que .(dot) lo es, así que nunca me molesto en usarlo source.

  2. Eso es correcto: el abastecimiento de un archivo ejecuta los comandos en el shell actual y afectará su entorno de shell actual. Todavía puede pasar argumentos al archivo de origen y bash realmente buscará $PATHel nombre del archivo como un comando normal si no contiene barras.


No relacionado con la pregunta original de .vs source, pero en su ejemplo,

. ./myScript.sh 

no es idéntico a

source myScript.sh

porque while .y sourceson funcionalmente idénticos, myScript.shy ./myScript.shno son lo mismo. Como ./myScript.shcontiene una barra oblicua, se interpreta como una ruta y el shell simplemente la usa ./myScript.sh. Sin embargo, myScript.shno tiene una barra oblicua, por lo que el shell $PATHprimero lo busca. Este es el comportamiento estándar especificado por POSIX para .. La mayoría de los shells se configuran de manera predeterminada, aunque pueden agregar extensiones (como buscar en el directorio de trabajo actual después de la búsqueda de ruta) u opciones para cambiar el comportamiento de ./ source.

jw013
fuente
2
El comportamiento cuando la ruta de acceso proporcionada del archivo no contiene a /depende del shell bashy zshdepende de si el modo POSIX está habilitado o no. También tenga en cuenta que en muchas implementaciones de ksh, se .comporta de manera diferente a source.
Stéphane Chazelas
@StephaneChazelas Sí, tienes razón. Agregué una nota para aclarar que la descripción anterior es del estándar POSIX.
jw013
8

Si, son equivalentes. No hay diferencia funcional; .es solo un sinónimo incorporado para source.

(Edit: Al parecer, esto sólo es cierto para bashy zshalgunos proyectiles más ligeros no tienen. source, Solamente .está especificada por POSIX modo ksh, dash, ash, etc pueden no tener sourceVer. La respuesta de jw013 para obtener información.)

Caleb
fuente
¡Gracias! Pero $ alias .salidas bash: alias: .: not found .
Tim
Es decir, ambos están integrados y el alias también está integrado. Esto está documentado , pero supongo que 'sinónimo' es el término correcto en este caso, no 'alias'.
Caleb