Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Chcę napisać skrypt, który przekaże zmienną — w tym konkretnym przypadku LC_ALL, LANG i LANGUAGE (skrypt do zmiany locale'i), jeśli ma to jakieś znaczenie.
Niestety proste
export ZMIENNA=wartość
działa tylko dla "sesji skryptu", w "sesji rodzica" zmienna nie jest ustawiana. Próbowałem exec export, niestety exec przyjmuje tylko samodzielne programy, nie wbudowane komendy (a taką jest export).
Rozwiązaniem z pewnością by było przepisanie ze skryptu do globalnej funkcji, ale wolałbym tego uniknąć — raczej preferowałbym samodzielny skrypt. Niby
source plik/z/zapisaną/funckją
w konfigu powłoki jest prawie samodzielnym skryptem, ale prawie robi różnicę...
Offline
nie wiem czy o to Ci hodzi
plik1
#!/bin/bash echo "przed zmiana "; env | grep -i LC_ export LC_ALL="pl_PL.ISO-8859-2"; env-update --no-ldconfig;
plik2
#!/bin/bash source plik1 echo "po zmianie" env | grep -i LC_
wykonanie
Mefisto tmp # sh plik2 przed zmiana LC_ALL=pl_PL.UTF-8 po zmianie LC_ALL=pl_PL.ISO-8859-2 Mefisto tmp # env | grep -i LC_ LC_ALL=pl_PL.UTF-8 Mefisto tmp #
na powloce mam utf'a a w skrypcie juz iso jak skrypt zrobi co trzeba to mam utfa spowrotem :]
Offline
BiExi napisał(-a):
na powloce mam utf'a a w skrypcie juz iso jak skrypt zrobi co trzeba to mam utfa spowrotem :]
Nie właśnie, chcę żeby na powłoce po wykonaniu skryptu było to, co zostanie ustawione w skrypcie.
Może napiszę, "pseudokod" "pseudowynik" jak to ma wyglądać:
user@system ~$ locale | grep LC_ALL LC_ALL=pl_PL user@system ~$ ./skrypt.sh en_EN * aktualne locale: pl_PL * ustawiam locale: en_EN * aktualne locale: en_EN user@system ~$ locale | grep LC_ALL LC_ALL=en_EN
Offline
a może poprzez /proc/$PPID/environ
$ bash # startuje nowa interaktywna powloke jako child-process $ hd /proc/$PPID/environ|head -5 00000000 4b 44 45 5f 46 55 4c 4c 5f 53 45 53 53 49 4f 4e |KDE_FULL_SESSION| 00000010 3d 74 72 75 65 00 58 43 55 52 53 4f 52 5f 54 48 |=true.XCURSOR_TH| 00000020 45 4d 45 3d 6e 6f 6e 65 00 47 52 45 50 5f 4f 50 |EME=none.GREP_OP| 00000030 54 49 4f 4e 53 3d 2d 2d 63 6f 6c 6f 72 3d 61 75 |TIONS=--color=au| 00000040 74 6f 00 47 53 5f 4c 49 42 3d 2f 68 6f 6d 65 2f |to.GS_LIB=/home/|
tylko to jest raczej mało eleganckie rozwiązanie, no nie?
Offline
harry666t napisał(-a):
tylko to jest raczej mało eleganckie rozwiązanie, no nie?
abstrahując od tego, że w ogóle tego nie rozumiem, to tak, nie jest przesadnie eleganckie :)
Offline
Uruchamiaj skrypt przez source /sciezka/do/skryptu -para -metry.
minio@pingwin ~ ]:-> locale |grep -i LANG LANG=pl_PL.UTF-8 minio@pingwin ~ ]:-> skrypty/test.sh pl_PL 2>/dev/null Przed zmianą: LANG=pl_PL.UTF-8 Ustawiam locale: pl_PL Po zmianie: LANG=pl_PL minio@pingwin ~ ]:-> locale |grep -i LANG LANG=pl_PL.UTF-8 minio@pingwin ~ ]:-> source skrypty/test.sh pl_PL 2>/dev/null Przed zmianą: LANG=pl_PL.UTF-8 Ustawiam locale: pl_PL Po zmianie: LANG=pl_PL minio@pingwin ~ ]:-> locale 2>/dev/null |grep -i LANG LANG=pl_PL minio@pingwin ~ ]:-> cat skrypty/test.sh #!/bin/bash echo "Przed zmianą: " locale |grep -i LANG echo "Ustawiam locale: $1" LANG=$1 echo "Po zmianie: " locale |grep -i LANG
(STDERR jest wysyłany na /dev/null, ponieważ locale sypie błędami o nieustawionych localach; ja mam tylko pl_PL.UTF-8 u siebie.)
Skrypty powłoki uruchamiane są w podpowłoce, czyli w procesie-dziecku. Nie istnieje żaden sposób żeby proces potomny w jakikolwiek sposób wpłynął na środowisko procesu-rodzica. Po prostu. Nie ma czegoś takiego. Nie trudno zresztą się domyślić dlaczego.
Natomiast uruchamiając skrypt przez source, jego zawartość nie jest wykonywana w podpowłoce, a jest czytana i po kolei wykonywana. Czyli tak jakbyś kolejne linie po prostu wpisywał zatwierdzał.
Ostatnio edytowany przez Minio (2008-07-15 16:02:48)
Offline
Strony: 1