2012-12-31 5 views
7

Ustawiam tablicę jako zmienną środowiskową w ten sposób np. Skrypt test.shbash: ustaw zmienną tablicę env i usuń ją z dowolnego skryptu powłoki.

w test.sh

#!/bin/bash 
export STRING=("str1" "str2") 

źródła test.sh

teraz w skrypcie test-1.sh

#!/bin/bash 
echo ${STRING[0]} 

odpowiedź jest nic, tylko pusty wiersz, natomiast, jeśli Próbuję ustawić STRING="str1" w test.sh i zrobić echo $STRING w test-1.sh, to działa.

testy są wykonywane wyłącznie od użytkownika root, Teraz, jak ustawić tablicę jako zmienną env, aby móc wywoływać elementy tablicy zgodnie z wymaganiami? Wcześniej próbowałem nawet zmodyfikować /etc/bashrc i to też nie przyniosło niczego pozytywnego.

Potrzebuję ustawić tablicę jako zmienną env, ponieważ może być wiele skryptów, które muszę napisać, które będą korzystać z tych zmiennych ustawień.

Czy ktoś może podać mi sugestie, aby poprawić mnie w miejscu, w którym robię źle?

Odpowiedz

10

Przeczytaj uważnie instrukcję "błędów".

Zmienne tablicy mogą nie zostać (jeszcze) wyeksportowane.

Chociaż, nie wiem, że wielu uważa to za prawdziwy błąd. Inne powłoki, które obsługują tablice w stylu ksh, również nie pozwalają na ich eksportowanie.

Można łatwo przekazać definicje tablic za pomocą parametrów lub zmiennych lub środowiska. Zwykle nie jest to jednak zbyt przydatne.

function f { 
    unset -v "$2" 
    typeset "$2" 
    eval "${!1}" 
    typeset -p "$2" 
} 

typeset -a a=(a b c) 
myArr=$(typeset -p a) f myArr a 
0

Próbujesz umieścić tablicę w zmiennej środowiskowej, a zmienne środowiskowe mogą być tylko ciągami. bash nie ma metody poprawnego serializowania/deserializacji tablic; rób to ręcznie.

2

Nieporozumienie polega na tym, że zmienne środowiskowe są używane tylko przez powłoki - nie są. Żadne atrybuty, w tym tylko do odczytu, liczba całkowita i tablice, nie mogą być eksportowane do bloku środowiska. Zmienne środowiskowe mogą być odczytywane przez dowolny język, C, C++, Perl, Java, Python, PHP i tak dalej. Istnieją również w systemie Windows.

Jak inny język może obsługiwać atrybuty Bash? Wszystkie zmienne środowiskowe są konwertowane na łańcuchy, z wyjątkiem Bash, w którym wartości tablic nie są w ogóle eksportowane.

Powłoka Korn wyeksportuje tylko pierwszy element. ksh93 wykorzystuje także pewne exploity exec, aby zachować zmienne atrybuty wyeksportowane do dzieci powłoki Korn.

Nawiasem mówiąc, za niewłaściwą praktykę uważa się użycie nazwy UPPERCASE dla nazw zmiennych, ponieważ mogą one kolidować z tymi używanymi przez powłokę. Ponadto w Bash 3 nazwa STRING ma problemy podczas eksportowania (naprawione w Bash 4).

0

Zmienne środowiskowe przekazywane z procesów do ich potomków są nieustrukturowanymi ciągami; tablice nie mogą być obsługiwane. Możesz to pokazać w Bash:

export x=foo 
printenv x 

Który wyprowadza foo. Gdybym teraz powodować x stać tablicę

x=(foo bar) 
printenv x 

nie widzimy wyjścia (x nie są eksportowane).