Un altro modo è quello di chiamare l'interprete e passandogli il percorso dello script:
/bin/sh /path/to/script
Il punto e la sorgente sono equivalenti. (EDIT: no, non lo sono: come sottolinea KeithB in un commento su un'altra risposta, "." Funziona solo con shell correlate a bash, dove "source" funziona con shell sia bash che csh.) Esegue lo script in -place (come se avessi copiato e incollato lo script proprio lì). Ciò significa che restano tutte le funzioni e le variabili non locali nello script. Significa anche se lo script fa un cd in una directory, sarai ancora lì quando avrà finito.
Gli altri modi di eseguire uno script lo eseguiranno nella sua stessa shell secondaria. Le variabili nello script non sono ancora vive al termine. Se lo script ha cambiato directory, non influisce sull'ambiente chiamante.
/ path / to / script e / bin / sh script sono leggermente diversi. In genere, una sceneggiatura all'inizio ha uno "shebang" che assomiglia a questo:
#! /bin/bash
Questo è il percorso dell'interprete di script. Se specifica un interprete diverso da quello che fai quando lo esegui, allora potrebbe comportarsi diversamente (o potrebbe non funzionare affatto).
Ad esempio, gli script Perl e gli script Ruby iniziano con (rispettivamente):
#! /bin/perl
e
#! /bin/ruby
Se esegui uno di questi script eseguendolo /bin/sh script
, non funzioneranno affatto.
Ubuntu in realtà non usa la shell bash, ma molto simile chiamata dash. Gli script che richiedono bash possono funzionare in modo leggermente errato quando vengono chiamati facendo /bin/sh script
perché hai appena chiamato uno script bash utilizzando l'interprete trattino.
Un'altra piccola differenza tra la chiamata diretta dello script e il passaggio del percorso dello script all'interprete è che lo script deve essere contrassegnato come eseguibile per eseguirlo direttamente, ma non per eseguirlo passando il percorso all'interprete.
Un'altra variante minore: puoi aggiungere un prefisso a uno di questi modi per eseguire uno script con eval, quindi puoi avere
eval sh script
eval script
eval . script
e così via. In realtà non cambia nulla, ma ho pensato di includerlo per completezza.