Masz w zasadzie dwie opcje:
- Ustaw zmienną jako zmienną środowiskową (
export TESTVARIABLE
) przed uruchomieniem drugiego skryptu.
- Źródło drugiego skryptu, tzn
. test2.sh
. Będzie działał w tej samej powłoce. Umożliwiłoby to łatwe dzielenie się bardziej złożonymi zmiennymi, takimi jak tablice, ale oznacza również, że drugi skrypt może modyfikować zmienne w powłoce źródłowej.
AKTUALIZACJA:
Aby użyć export
do ustawienia zmiennej środowiskowej, możesz użyć istniejącej zmiennej:
A=10
# ...
export A
To powinno działać w obie bash
i sh
. bash
umożliwia także łączenie go w następujący sposób:
export A=10
Działa to również w moim sh
(tak się składa bash
, że możesz użyć echo $SHELL
do sprawdzenia). Ale nie wierzę, że to gwarantuje, że w ogóle zadziała sh
, więc najlepiej grać bezpiecznie i rozdzielić je.
Każda zmienna eksportowana w ten sposób będzie widoczna w wykonywanych skryptach, na przykład:
popiół:
#!/bin/sh
MESSAGE="hello"
export MESSAGE
./b.sh
b.sh:
#!/bin/sh
echo "The message is: $MESSAGE"
Następnie:
$ ./a.sh
The message is: hello
Fakt, że są to oba skrypty powłoki, jest również przypadkowy. Zmienne środowiskowe można przekazać do dowolnego wykonywanego procesu, na przykład jeśli zamiast tego użyjemy Pythona, może to wyglądać:
popiół:
#!/bin/sh
MESSAGE="hello"
export MESSAGE
./b.py
b.py:
#!/usr/bin/python
import os
print 'The message is:', os.environ['MESSAGE']
Pozyskiwanie:
Zamiast tego moglibyśmy uzyskać takie źródło:
popiół:
#!/bin/sh
MESSAGE="hello"
. ./b.sh
b.sh:
#!/bin/sh
echo "The message is: $MESSAGE"
Następnie:
$ ./a.sh
The message is: hello
To mniej więcej „importuje” zawartość b.sh
bezpośrednio i wykonuje ją w tej samej powłoce . Zauważ, że nie musieliśmy eksportować zmiennej, aby uzyskać do niej dostęp. To domyślnie udostępnia wszystkie zmienne, które masz, a także pozwala drugiemu skryptowi dodawać / usuwać / modyfikować zmienne w powłoce. Oczywiście w tym modelu oba skrypty powinny być w tym samym języku ( sh
lub bash
). Aby podać przykład, w jaki sposób możemy przekazywać wiadomości w tę iz powrotem:
popiół:
#!/bin/sh
MESSAGE="hello"
. ./b.sh
echo "[A] The message is: $MESSAGE"
b.sh:
#!/bin/sh
echo "[B] The message is: $MESSAGE"
MESSAGE="goodbye"
Następnie:
$ ./a.sh
[B] The message is: hello
[A] The message is: goodbye
Działa to równie dobrze w bash
. Ułatwia także udostępnianie bardziej złożonych danych, których nie można wyrazić jako zmienną środowiskową (przynajmniej bez dużego obciążenia z twojej strony), takich jak tablice lub tablice asocjacyjne.