Cosa significa punto rovesciato come comando?


17

Un software che ho installato ha inserito una riga nel mio profilo che legge:

[ -s "$SOME_FILE" ] && \. "$SOME_FILE"

So che punto .è sinonimo di source, quindi ho il sospetto che questo sia solo il sourcing del file, ma non ho mai visto \.prima; fa qualcos'altro?

Modifica, per quanto riguarda i DV: la ricerca di "punti rovesciati" porta a domande relative ./alla chiamata di file eseguibili e man sourceconduce a una pagina di manuale in cui \.non viene visualizzato. Non so cos'altro provare, quindi la domanda.

Modifica 2: vedere le domande correlate

Risposte:


31

Una barra rovesciata al di fuori delle virgolette significa "interpretare il personaggio successivo letteralmente durante l'analisi". Dato che .è un carattere ordinario per il parser, \.viene analizzato allo stesso modo di ., e invoca il builtin .(di cui sourceè sinonimo in bash).

C'è un caso in cui potrebbe fare la differenza in questo contesto. Se un utente ha definito un alias chiamato in .precedenza .profile, e .profileviene letto in una shell che espande gli alias (che bash fa solo di default quando viene invocato in modo interattivo), allora .si innescherebbe l'alias, ma \.continuerebbe comunque a innescare, perché la shell non prova l'espansione dell'alias su parole citate in alcun modo.

Sospetto che sia .stato modificato in \.perché un utente si è lamentato dopo aver creato un alias per ..

Si noti che \.invocherebbe una funzione chiamata .. Presumibilmente gli utenti che scrivono funzioni sono più informati degli utenti che scrivono alias e saprebbero che ridefinire un comando standard .profileè una cattiva idea se si intende includere codice di terze parti. Ma se volessi bypassare alias e funzioni, potresti scrivere command .. L'autore di questo frammento non lo ha fatto nemmeno perché si preoccupava delle conchiglie antiche che non avevano il commandbuiltin, o più probabilmente perché non ne erano consapevoli.

A proposito, definire qualsiasi alias in .profileè una cattiva idea perché .profileè uno script di inizializzazione della sessione , non uno script di inizializzazione della shell . Gli alias per bash appartengono a .bashrc.


9

Il \.è un "punto letterale", vale a dire solo un punto. Sarà preso come .comando standard (simile a sourcein bash).

Lo standard POSIX ha questo da dire al riguardo (la mia enfasi)

Un valore <backslash>non quotato deve conservare il valore letterale del seguente carattere , ad eccezione di a <newline>. Se a <newline>segue il <backslash>, la shell deve interpretarlo come continuazione della linea. Il <backslash>e <newline>deve essere rimosso prima di suddividere l'input in token . Poiché l'escaping <newline>viene rimosso completamente dall'input e non viene sostituito da alcuno spazio bianco, non può fungere da separatore di token.

Il carattere punto può essere modificato:

$ alias .='echo hello'
$ .
hello

ciò significa che \.eviterebbe di utilizzare la versione con alias del .comando, perché ,

Dopo che un token è stato delimitato, ma prima di applicare le regole grammaticali in Shell Grammar, una parola risultante identificata come parola del nome del comando di un comando semplice deve essere esaminata per determinare se si tratta di un nome alias non quotato e valido.


Stavo cercando una fonte ufficiale su come la barra rovesciata in una parola viene interpretata come quotazione e come ciò impedisce l'espansione dell'alias. Grazie per il riferimento!
Sheljohn,

1
@Sheljohn Vedi risposta aggiornata.
Kusalananda
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.