2011-04-15 11 views
6

Mam dwa niezależnie uruchomione skrypty. Najpierw powiedzmy, że skrypt A oblicza pewne wartości. I chcę echo tych wartości z innego skryptu o nazwie B. Te skrypty nie będą nawiązywać się nawzajem. Użyłem słowa kluczowego eksportu, ale nie działało. Jak mogę to zrobić?Eksportowanie zmiennych między skryptem powłoki

+1

nie Will '. skrypt "załatwiać sprawę? (zobacz http://www.linuxquestions.org/questions/linux-newbie-8/how-to-export-environment-variable-from-a-bash-script-344057/) – mlvljr

+0

@mlvljr Powinieneś zrobić to odpowiedź , ponieważ to było to, czego potrzebowałem. Dzięki. – Rebs

+0

@AdamGriffiths Cóż, staram się uniknąć wyścigu punktowego reputacji;) – mlvljr

Odpowiedz

6

Gdybym rozumiał wymaganie to może nie oba skrypty być po prostu wykonane w tej samej powłoce sub, niezależnie jednak bez nazywając siebie lub bez potrzeby zewnętrznego pliku lub rury jak ten:

Powiedzmy jest to Twoja script1.sh

#!/bin/bash 
# script1.sh: do something and finally 
export x=19 

I tu nam swoją script2.sh

#!/bin/bash 
# script2.sh: read value of $x here 
echo "x="${x} 

Wystarczy zadzwonić do nich w tym samym sub-shell jak ten

(. ./script1.sh && ./script2.sh) 

wyjściowa:

x=19 
0

Nie możesz odczytać trzeciego pliku, powiedzmy settings.sh ze wspólnymi wyeksportowanymi zmiennymi?

# common.sh 
export MY_PATH=/home/foo/bar/ 
export VERSION=42.2a 

i zarówno w A, jak i B source common.sh, aby załadować te wartości.

Uwaga: w takim przypadku eksport może nie być wymagany.

+0

Nie potrzebuję właściwie trzeciego pliku. – thetux4

0

Możesz wysyłać wartości do plików, a drugi skrypt może je czytać. Jeśli chcesz użyć go jako parametr do czegoś użyć odwrotnego aposthrophe:

echo `cat storedvalue` 

Bądź ostrożny, jeśli dwa skrypty są uruchomione w tym samym czasie, mogą wystąpić problemy współbieżności, co może powodować rzadko pojawia się, mistyka- szukanie błędów.

+0

Jak mogę przekazać zwracaną wartość skryptu A do skryptu B? – thetux4

4
mkfifo /tmp/channel 

process_a.sh > /tmp/channel& 
process_b.sh < /tmp/channel& 

wait 

Oczywiście można również po prostu przeczytać jedną linię, kiedy chcesz.

W bashu są kopie, które również mogą być tym, co chcesz. Losowy przykład z this page

# let the output of the coprocess go to stdout 
{ coproc mycoproc { awk '{print "foo" $0;fflush()}' ;} >&3 ;} 3>&1 
echo bar >&${mycoproc[1]} 
foobar 

ksh ma podobną funkcję, widocznie

+0

Komunikacja pomiędzy oddzielnymi procesami jest najłatwiejsza w przypadku plików, a nazwana rura zapewnia poręczny interfejs podobny do pliku: 'A" FIFO "jest specjalnym typem pliku, który umożliwia niezależnym procesom komunikację." –

+0

coproc jest interesujący. sprawdzę to. – thetux4

1

Pomyśl każdego skryptu jako funkcja: function A oblicza jakąś wartość i zwraca go. Nie wie, kto to nazwie. Funkcja B przyjmuje pewną wartość i echo. Nie obchodzi, kto wytworzył tę wartość. Tak, scenariusz A:

#!/bin/sh 
# a.sh: Calculate something and return the result 
echo 19 

i skrypt B:

#!/bin/sh 
# b.sh: Consume the calculated result, which passed in as $1 
echo The result is $1 

Dodać do nich wykonywalny:

chmod +x [ab].sh 

Teraz możemy skleić je razem w wierszu poleceń:

$ b.sh $(a.sh) 
The result is 19 

Semantycznie, b.sh di d nie wywoływać a.sh. Zadzwoniłeś do a.sh i przekazałeś wynik do b.sh.

0

Właściwie wszystkie Twoje potrzeby jest source można pominąć prefiks export.

My use-case był środowisko plik specyficzne ustawienia, na przykład:

ciągu main_script.sh

THIS_DIR=`dirname $0` 
source $THIS_DIR/config_vars.sh 
# other commands 

ciągu config_vars.sh

Powiązane problemy