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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2008-07-15 11:36:34

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

powłoka: przekazanie zmiennej ze skryptu do "sesji rodzica"

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

Kod:

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

Kod:

source plik/z/zapisaną/funckją

w konfigu powłoki jest prawie samodzielnym skryptem, ale prawie robi różnicę...


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#2  2008-07-15 12:47:14

  BiExi - matka przelozona

BiExi
matka przelozona
Skąd: Gorlice
Zarejestrowany: 2004-04-16
Serwis

Re: powłoka: przekazanie zmiennej ze skryptu do "sesji rodzica"

nie wiem czy o to Ci hodzi
plik1

Kod:

#!/bin/bash
echo "przed zmiana ";
env | grep -i LC_
export LC_ALL="pl_PL.ISO-8859-2";
env-update --no-ldconfig;

plik2

Kod:

#!/bin/bash
source plik1
echo "po zmianie"
env | grep -i LC_

wykonanie

Kod:

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 :]

Online

 

#3  2008-07-15 12:56:44

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: powłoka: przekazanie zmiennej ze skryptu do "sesji rodzica"

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ć:

Kod:

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

Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#4  2008-07-15 15:04:53

  harry666t - Członek DUG

harry666t
Członek DUG
Zarejestrowany: 2007-01-28

Re: powłoka: przekazanie zmiennej ze skryptu do "sesji rodzica"

a może poprzez /proc/$PPID/environ

Kod:

$ 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?


[ /\/\/\ o_0 ----->>>       Ascii Art Userbar User ]

"steal and steal and steal some more and give it to all your friends and keep on stealin'"
- Reznor

Offline

 

#5  2008-07-15 15:09:25

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: powłoka: przekazanie zmiennej ze skryptu do "sesji rodzica"

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 :)


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#6  2008-07-15 15:54:22

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: powłoka: przekazanie zmiennej ze skryptu do "sesji rodzica"

Uruchamiaj skrypt przez source /sciezka/do/skryptu -para -metry.

Kod:

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

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)