2014-11-17 11 views
8

In Bash, l'assegnazione dei valori alle variabili viene eseguita utilizzando T=content, senza spazi prima o dopo il segno di uguale.Assegnazione di variabili con lo spazio dopo il segno (=)?

Nonostante ciò ho visto quanto segue in uno script di shell PWD= /bin/pwd contenente uno spazio sul lato destro del segno di uguale.

Qual è lo scopo di avere uno spazio?

+1

hai eseguito lo script e hai visto cosa contiene il PWD?Sarà vuoto e vedrai la directory di lavoro presente stampata quando esegui lo script? – SMA

+0

Sì, PWD diventa vuoto – kaneda

risposta

7

Nell'esempio PWD= /bin/pwd, la variabile PWD è impostata sulla stringa vuota prima dell'esecuzione del comando /bin/pwd. La modifica ha effetto solo per quella linea.

Questo può essere utile per apportare una modifica temporanea a una variabile ai fini dell'esecuzione di un comando, senza influire sul valore originale. Un altro esempio di questo potrebbe essere quando utilizza read, per impostare un diverso IFS:

IFS=, read a b c <<<"comma,separated,list" 

Questo imposta il separatore di campo di una virgola in modo che a, b e c vengono letti correttamente. Dopo questa riga, IFS restituisce il valore predefinito, quindi il resto dello script non è interessato.

Forse in alcuni sistemi, l'output del comando pwd è influenzato dal valore della variabile PWD, così facendo si evita problemi causati da PWD sovrascrittura altrove.

+0

Forse questo è per shell differenti oltre alla compatibilità bash? Questa è la spiegazione dell'autore: '# La seguente circonlocuzione (ripetuta di seguito) assicura che registriamo il vero nome della directory e non uno che è simulato con nomi di link simbolici. – kaneda

+1

Sì, da quel commento, sembra che sia possibile che '$ PWD' in alcuni casi viene assegnato un valore errato e' pwd' leggerà questo valore se è impostato, piuttosto che elaborare il percorso reale, su alcune altre shell. –

+0

Questo è chiaro ora, grazie – kaneda

2
PWD= pwd 

Questa sintassi assegna il valore vuoto alla variabile PWD per la durata del comando pwd.

PWD=ick 
echo "$PWD" 

Questo assegna PWD per il resto dello script.

PWD=ick pwd 
echo "$PWD" 

Questo assegna PWD solo per la durata del comando pwd; lo echo riprodurrà il valore che era in vigore prima e dopo la chiamata pwd.

PWD= 

assegna Questo semplicemente il valore di vuoto PWD.

+1

Per quello che vale, il comando 'pwd' di Bash riporta la directory corrente indipendentemente dal valore di' PWD'. – tripleee

+0

Grazie per le informazioni – kaneda

+0

Per inciso, l'hardcode '/ bin/pwd' di solito non è necessario e potrebbe essere una cattiva idea. Gli script dovrebbero fidarsi dell'utente di avere un 'PATH' sano e consentire loro di sovrascrivere i comandi di sistema in alcune circostanze (i comandi di derisione in uno script di test vengono immediatamente in mente come uno scenario comune). Ovviamente, qui, potresti voler assicurare che qualsiasi comando integrato di shell 'pwd' venga aggirato in favore di un binario esterno? Ma nel caso generale, dissuaderei dal farlo. – tripleee

2

Non stiamo parlando di due cose diverse qui.

Se avessimo

PWD=/bin/pwd 

vorremmo assegnare /bin/pwd a PWD.

Ma

PWD= /bin/pwd 

significa che chiamiamo /bin/pwd con PWD impostato alla stringa vuota. Questa assegnazione ha effetto solo sul processo secondario, non su quello corrente.

Problemi correlati