2014-11-21 14 views
5

przypadek 0

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

utworzyć plik: 1

i wyjście:

i = 0

komentarz : dlaczego i = 0?

przypadek 1

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

wyjściowa:

i = 1

komentarz: wynik jest prawidłowy

przypadek 2

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

utworzyć plik: 1

i wyjście:

i = 1

komentarz: wynik jest prawidłowy

przypadek 3

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

wyjściowa:

i = 0

komentarz: może przypadek 3 < => case 0?

przypadek 4

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

utworzyć plik: 1

i wyjście:

i = 1

komentarz: dlaczego diff z przypadkiem 0?

przypadek 5

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

utworzyć plik: 1

i wyjście:

i = 1

Komentarz: ta sprawa z gniourf_gniourf

więcej przypadków:

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

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

Jestem bardzo mylić, dlaczego i = 0 w przypadku 0?

Czy to błąd?

Moja wersja bash GNU bash, wersja 3.2.25 (1) -release (i686-RedHat-linux-gnu)

Można spróbować w bash.

+0

to nie jest błąd, ponieważ są one występować w różnych nazw. – muradin

+0

@muradin: W bashu nie ma żadnych przestrzeni nazw. – choroba

+0

@choroba: Różne sesje, jak poprawnie wspomniano 'subshells' mają swoje własne zmienne. Nie są one widoczne dla innych i to właśnie miałem na myśli. Nie przestrzenie nazw jak inne języki, takie jak C++. – muradin

Odpowiedz

4

Różnica echo i ls jest ls jest polecenie zewnętrzny /usr/bin/ls, a echo jest wbudowane powłoki. Spróbuj zastąpić go /usr/bin/echo (jeśli istnieje w twoim systemie). Otrzymasz to samo zachowanie - wygląda na to, że przekierowanie ma miejsce w podpowłoce uruchamiającej polecenie.

Porównaj:

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

Dziękujemy! Dodałem przypadek 4, dlaczego przypadek 4 i = 1? –

+0

@ 赵小刚: Ponieważ 'command' jest wbudowanym. – choroba

+0

Rozumiem, że przyczyną tego zachowania jest podpowłoki, czy to prawda? Brak podpowłoki podczas używania "command ls> $ ((++ i))"? –

Powiązane problemy