Fonte vs. perché comportamento diverso?


17

Di recente l'ho imparato

. ./.a.aed ./.a.aè lo stesso.

Tuttavia provando source source .a.adà un errore. IMO, .essendo alias Bash sourcenon dovrebbe comportarsi diversamente, quindi cosa mi sto perdendo?

Bonus, perché va . .bene mentre source sourcenon lo è?


8
Avresti potuto scegliere un nome più chiaro per il tuo esempio :). In ogni caso, cosa ti ha dato l'idea . scripte ./scriptsono la stessa cosa? Certamente no . Inoltre, .non è un alias di source. È il contrario. .è lo standard ed sourceè un alias di ..
terdon

2
Dopo aver passato un po 'di tempo a guardare gli script di shell, ti abitui al .comando, ma intendo sourceè solo un comando così migliore, quando vedi source somefilein uno script sai immediatamente cosa fa quell'affermazione, ma . somefile non solo non è ovvio cosa faccia, puoi facilmente perdere del . tutto il personaggio
the_velour_fog

Bonus, perché lo è. . OK, mentre la fonte di origine non lo è? - in quanto il messaggio di errore bash: .: .: is a directorysu . .è esigenze ok per essere spiegato.
Contromodalità

@terdon - assolutamente giusto. L'esempio originale doveva . ./.a.a .essere sincero. : -Q quiz di sorta, se vuoi. :-) La domanda collegata è fantastica, molte grazie. Cosa mi ha dato quell'idea: il fatto di non aver visto differenze nell'esecuzione dei file in questo modo e il fatto che ho letto da qualche parte .è un alias per source. :-)
LAFK dice Reinstate Monica il

Risposte:


27

Non puoi semplicemente sostituire . con sourceovunque; Se

. ./.a.a

funziona, puoi sostituire il primo . (almeno in Bash):

source ./.a.a

Il secondo .rappresenta la directory corrente, non è possibile sostituirla con source(soprattutto non ./con sourcecome hai fatto).

source source

sarebbe OK se avessi un file chiamato sourcenella directory corrente, contenente qualcosa di significativo per la tua shell corrente. Non riesco a vedere come . .sarebbe OK ...

Inoltre, . ./.a.ae ./.a.anon sono gli stessi, il secondo modulo viene eseguito .a.ain una shell separata. Vedi Qual è la differenza tra sourcing ('.' O 'source') ed esecuzione di un file in bash? per dettagli.


9

sourceè una parola chiave della shell che dovrebbe essere usata in questo modo: sourcefiledove filecontiene comandi shell validi. Questi comandi della shell verranno eseguiti nella shell corrente come se fossero stati digitati dalla riga di comando. Adesso,.file fa esattamente lo stesso.

Oltre a ciò .da solo significa "la directory di lavoro corrente" come in ./xyz(" xyzin questa directory") o a/b/./c/./d(che è identico aa/b/c/d ).

Oltre a ciò .in un nome di file ha un significato solo per convenzione come in .foobarcui indica un file "nascosto" (non proprio ...) o come infoobar.pdf , che indica un formato di file dal suffisso (qui .pdf).

Questi diversi significati non possono essere scambiati.


8
.non è in alcun modo obsoleto. Diversamente sourcedal modo portatile e definito da POSIX per l'approvvigionamento di un file. L' sourcealias è specifico della shell e può essere assente (ad esempio in dash) o comportarsi diversamente dallo standard ..
Terdon

Grazie @terdon, Wiki afferma che la fonte come punto (.) Non è accettabile nella shell C, dove è apparso per la prima volta il comando.
Noam Manos,

1
@NoamManos forse, ma la C-shell non è POSIX, quindi può (e fa) comportarsi in modo molto diverso.
Terdon
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.