esecuzione di script con “. "E con" fonte "


26
  1. Mi chiedevo se i seguenti due modi di eseguire uno script bash siano equivalenti?

    . ./myScript.sh
    
    source myScript.sh
    
  2. Entrambi eseguono il contenuto dello script invece di eseguire lo script, ovvero non stanno creando una subshell per eseguire lo script?

1
Ehi, è nella manpage!
alex,

@alex: fammi vedere per favore? man ., man sourceO qualsiasi altra cosa che non ho so ancora.
Tim

2
Vedi type .ehelp .
rozcietrzewiacz il

man $SHELL,/source
alex

4
. è più portatile secondo gli altri.
l0b0

Risposte:


21
  1. Sono equivalenti in bash in quanto fanno esattamente la stessa cosa. D'altra parte, sourceè più lungo di 5 caratteri e non è portabile solo con shell POSIX o Bourne mentre .(punto) lo è, quindi non mi preoccupo mai di usarlo source.

  2. È corretto: l'approvvigionamento di un file esegue i comandi nella shell corrente e influirà sull'ambiente della shell corrente. Puoi comunque passare argomenti al file di provenienza e bash cercherà $PATHil nome del file proprio come un normale comando se non contiene barre.


Non correlato alla domanda originale di .vs source, ma nel tuo esempio,

. ./myScript.sh 

non è identico a

source myScript.sh

perché while .e sourcesono funzionalmente identici myScript.she ./myScript.shnon sono gli stessi. Poiché ./myScript.shcontiene una barra, viene interpretato come un percorso e la shell utilizza solo ./myScript.sh. Tuttavia, myScript.shnon ha una barra quindi la shell la $PATHcerca per prima. Questo è il comportamento standard specificato da POSIX per .. La maggior parte delle shell sono predefinite, sebbene possano aggiungere estensioni (come la ricerca nella directory di lavoro corrente dopo la ricerca del percorso) o opzioni per cambiare il comportamento di ./ source.


2
il comportamento quando il percorso fornito del file non contiene a /dipende dalla shell e per bashe zshdipende dal fatto che la modalità POSIX sia abilitata o meno. Nota anche che in molte implementazioni di ksh, .si comporta diversamente da source.
Stéphane Chazelas,

@StephaneChazelas Sì, hai ragione. Ho aggiunto una nota per chiarire che la descrizione sopra è dello standard POSIX.
jw013,

8

Sì, sono equivalenti. Non c'è differenza funzionale; .è solo un sinonimo incorporato per source.

(Edit: A quanto pare questo è vero solo per bashe zshalcuni gusci leggeri non hanno. source, Solo .è specificato da POSIX così ksh, dash, ash, ecc non possono avere sourceSede. La risposta di jw013 per informazioni.)


Grazie! Ma $ alias .uscite bash: alias: .: not found .
Tim

Cioè sono entrambi builtin e anche l'alias è incorporato. Questo è documentato , ma immagino che "sinonimo" sia il termine giusto in questo caso, non "alias".
Caleb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.