La . executable
sintassi non funziona con qualsiasi eseguibile (o funziona?). Invece, è un alias per il bash source
incorporato. Quindi la differenza è principalmente rilevante per gli script bash, e la verità è che sono cose completamente diverse :)
./executable
chiede di eseguire l'eseguibile "normalmente". ./
è un riferimento relativo al percorso corrente. Questo evita che la shell (bash) tenti di individuare l'eseguibile in una directory nella sua $PATH
(cosa che farebbe se non si specificasse affatto un percorso con il comando). Il motivo per cui non puoi semplicemente fare executable
è quello della sicurezza; immagina di decomprimere un archivio scaricato e che contiene una versione dannosa di ls
. Se fosse eseguito direttamente dalla tua directory corrente, avresti eseguito quella versione senza accorgertene.
D'altra parte, . executable
sta dicendo "sorgente di un file chiamato executable
". Dato che stai nominando direttamente il file e in realtà non deve essere un eseguibile, non si applica la limitazione di sicurezza per $ PATH. Il sourcing "eseguirà" (o sembrerà funzionare) solo script di shell. Quello che fa è:
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.
Quindi ... Qual è davvero la differenza tra esecuzione e sourcing? Supponendo che lo stesso script di shell, eseguendolo ( ./script
) genererà una nuova shell, eseguirà lo script all'interno di quella shell e, quando lo script uscirà, chiuderà quella shell e tornerà alla shell madre. In effetti, avvierà un nuovo bash
processo per eseguire lo script).
( . script
) farà sì che la shell corrente legga i comandi dal file come se fossero stati digitati nella riga di comando. Non ci sono nuove shell generate.
Un modo molto semplice per vedere come si comporta è scrivere uno script che contiene solo exit
. Se lo fai ./script
, nulla sembrerà accadere, questo perché viene avviato un nuovo processo di shell, il exit
comando esce da quella nuova shell e la shell corrente non viene influenzata.
Se si . script
, il terminale corrente verrà chiuso, poiché il exit
comando viene eseguito nella shell corrente. Quindi equivale a digitare exit
sul prompt dei comandi.