La . executablesintaxis no funciona con cualquier ejecutable (¿o sí?). En cambio, es un alias para el bash sourceincorporado. Entonces, la diferencia es principalmente relevante para los scripts de bash, y la verdad es que son cosas completamente diferentes :)
./executablepide 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 executablees 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, . executableestá 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 bashproceso 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 ./scripthace, parece que no sucederá nada, esto se debe a que se inicia un nuevo proceso de shell, el exitcomando sale de ese nuevo shell y su shell actual no se ve afectado.
Si usted . script, su terminal actual se cerrará, porque el exitcomando se ejecuta en el shell actual. Por lo tanto, es equivalente a escribir exiten el símbolo del sistema.