borzole Napisano Czerwiec 26, 2010 Zgłoszenie Share Napisano Czerwiec 26, 2010 Mam taki skrypt #!/bin/bash head -n 5 /etc/passwd | while read -r LINE do # ładujemy do tablicy name[${#name[*]}]=`cut -d: -f1 <<< $LINE` # test x echo -e x ${#name[*]} ${name[*]} done # test y echo -e y ${#name[*]} ${name[*]} echo ---- set | egrep '^(BASH_VERSION|BASHOPTS|SHELLOPTS)' wyjście x 1 root x 2 root bin x 3 root bin daemon x 4 root bin daemon adm x 5 root bin daemon adm lp y 0 ---- BASHOPTS=cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath BASH_VERSION='4.1.7(1)-release' SHELLOPTS=braceexpand:hashall:interactive-comments jak widać testy x i y są identyczne, ale rezultaty inne (y 0 powinien wyglądać jak x 5) dlaczego ? Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
borzole Napisano Czerwiec 26, 2010 Autor Zgłoszenie Share Napisano Czerwiec 26, 2010 Tworzony jest subshell, a dlaczego? Nie wiem. Ku przestrodze innych i mojemu totalnemu niezrozumieniu dlaczego (?!) taka konstrukcja echo hello | while ... ozn. tak naprawdę echo hello | ( while ... ) czyli subshell, a zmienne w środku są izolowane. Co dziwne "wtłoczenie" danych od tyłu while ... do ... done <plik jest całkowicie poprawnie bez subshell'a Obejściem może być użycie "dokumentów miejscowych" while ... done <<__EOF__ $(head -n 5 /etc/passwd) __EOF__ lub "potoków nazwanych' mkfifo ${pipe:=/tmp/testpipe} && trap "rm -f $pipe" EXIT head -n 5 /etc/passwd >$pipe & while ... done <$pipe Czy to jest bug, czy kwestia jakiś ustawień? [EDIT] http://fvue.nl/wiki/Bash:_Piped_%60while-r...starts_subshell można jeszcze tak ... done < <(head -n 5 /etc/passwd) Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się