Risposte:
Per il tuo script specifico funzionerà in entrambi i modi, tranne per il fatto che ./script.sh
richiede l'esecuzione e bit leggibili, mentre bash script.sh
richiede solo bit leggibili.
Il motivo della differenza dei requisiti di autorizzazione risiede nel modo in cui viene caricato il programma che interpreta lo script:
./script.sh
fa eseguire alla shell il file come se fosse un normale eseguibile.La shell execve
esegue il fork stesso e utilizza una chiamata di sistema (ad es. ) Per fare in modo che il sistema operativo esegua il file nel processo a fork. Il sistema operativo controllerà le autorizzazioni del file (quindi è necessario impostare il bit di esecuzione) e inoltrerà la richiesta al programma di caricamento del programma , che controlla il file e determina come eseguirlo. In Linux gli eseguibili compilati iniziano con un numero magico ELF , mentre gli script iniziano con un #!
( hashbang ). Un'intestazione hashbang significa che il file è uno script e deve essere interpretato dal programma specificato dopo l'hashbang. Ciò consente a uno script stesso di indicare al sistema come interpretare lo script.
Con lo script, il programma di caricamento programma verrà eseguito /bin/bash
e passato ./script.sh
come argomento della riga di comando.
bash script.sh
fa funzionare bash
e passare la shell script.sh
come argomento della riga di comandoQuindi il sistema operativo verrà caricato bash
(nemmeno guardando script.sh
, perché è solo un argomento della riga di comando). Il bash
processo creato interpreterà quindi script.sh
perché è passato come argomento della riga di comando. Poiché script.sh
viene letto solo bash
come file normale, il bit di esecuzione non è richiesto.
Ti consiglio di usare ./script.sh
però, perché potresti non sapere quale interprete richiede lo script. Quindi lascia che il programma di caricamento programmi lo determini per te.
. ./script.sh
non è la stessa cosa bash script.sh
(o ./script.sh
Considerare lo script. #!/usr/bin/python -V
<Newline> print test
.
. script.sh
. Ma sono d'accordo con le persone che scoraggiano l'uso del .
comando su script che non avrebbero dovuto essere invocato in quel modo. Sono sorpreso che nessuno abbia menzionato il fatto che, se lo script contiene exit
comandi e tu lo procuri, potrebbe disconnetterti. Un problema meno terribile sarebbe se lo script fa un cd
, poiché ciò influenzerebbe anche la shell genitore (interattiva).
bash script.sh
invoca direttamente lo script usando bash.
./script.sh
sta usando lo shebang #!/bin/bash
per determinare come eseguire.
Se vuoi davvero sapere, quale binario viene eseguito se lo fai, bash script.sh
potresti scoprirlo which bash
.
Quindi nel tuo esempio non fa differenza. Sì, devi chmod +x script.sh
essere in grado di eseguirlo direttamente tramite ./script.sh
.
/bin/bash
sia il primo bash
nel tuo $PATH
.
#!/bin/bash
funziona solo se c'è un/bin/bash
./script.sh
.
Crea un file Delete_Self.sh in questo modo:
#!/bin/rm
echo I am still here!
Esegui questo script come sh Delete_Self.sh
vedrai "Sono ancora qui!" riecheggiò.
Renderlo eseguibile ed eseguirlo come ./Delete_Self.sh
non vedrai nulla di echo indietro, mentre il file Delete_Self.sh
stesso è sparito.
Quindi la differenza è che:
bash script.sh
ignorerà il #! linea, perché bash è specificato come programma per eseguire script.sh../script.sh
leggerà il #! linea per determinare il programma da eseguire script.sh
.Oltre alle altre risposte, è utile conoscere la differenza tra l'esecuzione di uno script tramite ./script.sh
(i) e source ./script.sh
(ii) - La versione (i) crea una nuova shell in cui eseguire il comando, mentre (ii) lo esegue nel shell corrente - che può essere obbligatoria se l'eseguibile cambia le variabili di ambiente che devono essere conservate dopo la chiusura dell'eseguibile. Ad esempio, per attivare un ambiente conda python è necessario utilizzare quanto segue:
source activate my_env
NB Un'altra alternativa a source
quella che potresti incontrare è quella .
incorporata, ovvero
. activate my_env