2014-11-21 9 views
5

i=0; ls > $((++i)); echo i=$i 

creare un file: 1

e uscita:

i = 0

commento : perché io = 0?

caso 1

i=0; ls $((++i)); echo i=$i 

uscita:

i = 1

commento: il risultato è corretto

caso 2

i=0; echo > $((++i)); echo i=$i 

creare un file: 1

e uscita:

i = 1

commento: il risultato è corretto

caso 3

i=0; echo 1 | grep $((++i)); echo i=$i 

uscita:

i = 0

commento: forse il caso 3 < => 0 caso?

caso 4

i=0; command ls > $((++i)); echo i=$i 

creare un file: 1

e uscita:

i = 1

commento: perché diff con il caso 0?

caso 5

i=0; { ls; } > $((++i)); echo i=$i 

creare un file: 1

e uscita:

i = 1

commento: questo caso da gniourf_gniourf

più casi:

i=0; (echo) > $((++i)); echo i=$i #i=0 

i=0; { ls > $((++i)); }; echo i=$i #i=0 

Sono molto confuso, perché i = 0 in caso di 0?

Se si tratta di un bug?

La mia versione bash: GNU bash, la versione 3.2.25 (1) -release (i686-redhat-linux-gnu)

si può provare nel vostro bash.

+0

Questo non è un errore, perché le proprie prestazioni in spazi dei nomi diversi. – muradin

+0

@muradin: non ci sono spazi dei nomi in bash. – choroba

+0

@choroba: Diverse sessioni come hai giustamente menzionato 'subshells' hanno le loro variabili. Questi non sono visibili l'uno all'altro e questo era ciò che intendevo. Non spazi dei nomi come gli altri linguaggi come il C++. – muradin

risposta

4

La differenza tra echo e ls è che ls è un comando esterno /usr/bin/ls, mentre echo è un comando shell. Prova a sostituirlo con /usr/bin/echo (se esiste sul tuo sistema). Avrai lo stesso comportamento: sembra che il reindirizzamento avvenga in una sottoshell che esegue il comando.

Confronta:

$ i=0; /usr/bin/echo > $(((++i)); echo inside $i>&2; echo $i) ; echo i=$i 
inside 1 
i=0 
+0

Grazie! Ho aggiunto il caso 4, perché case 4 i = 1? –

+0

@ 赵小刚: Perché 'command' è un builtin. – choroba

+0

La mia comprensione è che la ragione di questo comportamento è subshell, giusto? Nessuna subshell quando usi "command ls> $ ((++ i))"? –

Problemi correlati