2015-09-25 7 views
6

mio semplice script è come questo:". Filename" non trova il file quando viene eseguito da/bin/sh, funziona da/bin/bash; perché?

#!/bin/sh 


DEF=.file_name_with_a_leading_dot.sh 

. ${DEF} 

Avviso/bin/sh sulla riga superiore. Quando eseguo questo semplice script, ricevo un errore che il file non è stato trovato. Ma, se cambio quella linea superiore a #!/Bin/bash, lo script trova quel file nella directory corrente bene.

Ma sul mio computer portatile Linux Ubuntu vedo che/bin/sh è un link simbolico a/bin/bash. Quindi, perché il mio script si comporta diversamente?

Inoltre, posso eseguire lo script come questo:

/bin/bash ./script.sh 

Ed è OK.

Quindi, cosa mi manca?

+0

Puoi dare un'occhiata qui: http://stackoverflow.com/questions/5725296/difference-between-sh-and-bash. Fondamentalmente, 'bash' e' sh' non sono la stessa cosa – ThanksForAllTheFish

+2

Bash si avvia in modalità di compatibilità quando chiamato come '/ bin/sh' – hek2mgl

+0

Ma perché significa che non trova il file? Posso riprodurre questo. – tripleee

risposta

6

Dal Manpage:

. nomefile [argomenti]

fonte nomefile [argomenti] Lettura ed esecuzione comandi dal nomefile nell'ambiente di shell corrente e restituire lo stato uscita dell'ultimo comando eseguito da nomefile. Se il nome file non contiene una barra, i nomi dei file in PATH vengono utilizzati per trovare la directory che contiene il nome file. Il file cercato in PATH non è necessario essere eseguibile. Quando bash non è in modalità posix, viene ricercata la directory corrente se non viene trovato alcun file in PATH. Se l'opzione sourpath su è disattivata, il PERCORSO non viene cercato. Se vengono forniti tutti gli argomenti, diventano i parametri posizionali quando viene eseguito il nome file . Altrimenti i parametri posizionali sono invariati. Lo stato di ritorno è lo stato dell'ultimo comando terminato nello script (0 se non vengono eseguiti comandi) e false se il nome file non viene trovato o non può essere letto.

Quindi, sembra che lo shebang #!/bin/sh imposta la bash in modalità posix. In questa modalità, viene valutato solo PATH, non la directory corrente.

+3

Il che significa: usare '. ./"$ DEF "' per farlo funzionare in modalità POSIX. – chepner