La . executable
sintaxis no funciona con cualquier ejecutable (¿o sí?). En cambio, es un alias para el bash source
incorporado. Entonces, la diferencia es principalmente relevante para los scripts de bash, y la verdad es que son cosas completamente diferentes :)
./executable
pide ejecutar el ejecutable "normalmente". ./
es una referencia relativa a la ruta actual. Esto evita que el shell (bash) intente ubicar el ejecutable en un directorio $PATH
(lo que haría si no especificara una ruta con el comando). La razón por la que no sólo puede hacer executable
es una de la seguridad; imagine que descomprime un archivo que descargó y que contiene una versión maliciosa de ls
. Si se ejecutara directamente desde su directorio actual, ejecutaría esa versión sin darse cuenta.
Por otro lado, . executable
está diciendo "fuente de un archivo llamado executable
". Dado que está nombrando directamente el archivo y realmente no tiene que ser un ejecutable, la restricción de seguridad para $ PATH no se aplica. Sourcing solo "ejecutará" (o parece que se ejecuta) scripts de shell. Lo que hace es:
source filename [arguments]
Read and execute commands from filename in the current shell
environment and return the exit status of the last command exe‐
cuted from filename.
Entonces ... ¿Cuál es realmente la diferencia entre la ejecución y el abastecimiento? Suponiendo que el mismo script de shell, ejecutarlo ( ./script
) generará un nuevo shell, ejecutará el script dentro de ese shell, y cuando el script salga, cierre ese shell y regrese al shell principal. En efecto, comenzará un nuevo bash
proceso para ejecutar el script).
( . script
) hará que el shell actual lea los comandos del archivo como si se estuvieran escribiendo en la línea de comandos. No se genera un nuevo caparazón.
Una manera muy fácil de ver cómo se comporta esto es escribir un script que solo contenga exit
. Si lo ./script
hace, parece que no sucederá nada, esto se debe a que se inicia un nuevo proceso de shell, el exit
comando sale de ese nuevo shell y su shell actual no se ve afectado.
Si usted . script
, su terminal actual se cerrará, porque el exit
comando se ejecuta en el shell actual. Por lo tanto, es equivalente a escribir exit
en el símbolo del sistema.