È un metodo specifico di bash per chiamare uno script: VARIABLE = valore bash somescript


2

Ho lavorato tutta la mia vita nella shell HPUX / ksh, quindi bash in questi giorni sembra lanciare nuovi modi di fare molte cose (molte delle quali non sembrano compatibili con POSIX - ad esempio 'mkdir -p / root / {abc , def, ghi, jkl} '- apparentemente questa è una best practice per le linee guida di codifica in bash / OpenStack - ma questa è una scelta completamente diversa).

Ad ogni modo, ho visto questo tipo di esecuzione dello script in più punti nel codice OpenStack:

ENABLE_VCENTER=true bash /root/stack_install.sh

Qualcuno può spiegare come funziona - So che la shell imposterà la variabile e quindi invocherà lo script della shell (che è la spiegazione del classico errore nooB per il motivo per cui l'assegnazione delle variabili non dovrebbe essere con gli spazi - ad esempio HELLO = world). Ma cosa succede esattamente internamente?

Inoltre, perché non sembra funzionare per me quando provo questo comando:

HELLO=world echo $HELLO

Ottengo il seguente output dalla shell:

[ ubuntuOne : /home/bumblebee ]
> HELLO=world echo $HELLO


[ ubuntuOne : /home/bumblebee ]
> 

Cosa mi sto perdendo qui?

Grazie per le tue risposte

Risposte:


2
HELLO=world echo $HELLO

In quanto sopra, bashespande i parametri prima che venga eseguita l'istruzione. Ciò significa che $HELLOviene sostituito con nulla (o qualunque sia il valore corrente di HELLO) prima dell'esecuzione dell'istruzione (che includerebbe l'impostazione di HELLO su world).

Osservare:

$ HELLO=world bash -c 'echo $HELLO'
world

Si noti che echo $HELLOè racchiuso tra virgolette singole. Le virgolette singole impediscono l'espansione dei parametri. Ciò significa che HELLO non viene valutato fino a quando la bashsubshell non si avvia e la vede come argomento. A quel punto, CIAO sarà stato impostato uguale a world.

Al contrario, considera questa riga in cui le virgolette singole sono state sostituite da virgolette doppie:

$ HELLO=world bash -c "echo $HELLO"

Qui non viene stampato nulla perché le virgolette non sopprimono l'espansione dei parametri. Pertanto, al bashcomando vengono forniti due argomenti -ce echo. Quindi, nulla stampa.

Tutti i dettagli cruenti

man bash spiega, in dettaglio, cosa succede quando vengono elaborati comandi come sopra:

Quando viene eseguito un semplice comando, la shell esegue le seguenti espansioni, assegnazioni e reindirizzamenti, da sinistra a destra.

   1.     The words that  the  parser  has  marked  as  variable
          assignments  (those  preceding  the  command name) and
          redirections are saved for later processing.

   2.     The words that are not variable assignments  or  redi
          rections  are  expanded.   If  any  words remain after
          expansion, the first word is taken to be the  name  of
          the command and the remaining words are the arguments.

   3.     Redirections  are  performed  as described above under
          REDIRECTION.

   4.     The text after  the  =  in  each  variable  assignment
          undergoes  tilde  expansion, parameter expansion, com
          mand substitution,  arithmetic  expansion,  and  quote
          removal before being assigned to the variable.

Considera di nuovo il comando:

HELLO=world echo $HELLO

L'argomento per echosubire l'espansione dei parametri nel passaggio 2 mentre bashnon inizia nemmeno ad assegnare il nuovo valore a HELLO fino al passaggio 4.


Aah ok - ora ha senso. Grazie. Quindi, suppongo, questa è una funzione solo bash?
Lakshminarayanan K.

@LakshminarayananK. È un comportamento shell POSIX standard, anche se non lo definirei una "funzionalità". Se pensi a come una shell elabora una riga di comando, ha comunque senso a modo suo.
Giovanni 1024,
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.