Skocz do zawartości

[bash] Zasięg Tablicy


borzole

Rekomendowane odpowiedzi

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

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

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ę
×
×
  • Dodaj nową pozycję...